Ts as const

Ts as const

as const 被称为 const 类型断言,const 类型断言告诉编译器,要将这个表达式推断为最具体的类型,如果不使用它的话,编译器会使用默认的类型推断行为,可能会把表达式推断为更通用的类型

转为常量

const a = 1  // 1
let b = 2  // number

以上代码,a的类型为1b的类型为number

a的类型只能是数字1,不能再修改,是个常量

bnumber类型,可以将b变量再次赋值给其他数字,b = 2

let b = 2 as const
b = 3 // 不能将类型“3”分配给类型“2”。

b变量就转为常量,b的类型为2,不能改变

结构中的应用

没有使用as const

import { useUrlQueryParam } from "utils/url"

export const useProjectsSearchParams = () => {
    const [param,setParam] = useUrlQueryParam(['name','personId'])
    return [
        {...param, personId:Number(param.personId) || undefined},
        setParam
    ] 
}

以上代码是一个自定义Hook,返回一个数组(严格来说是一个元组)

  • 第一个参数——对象
  • 第二个参数——函数

将返回的数据结构出来

const [projectParam,setParam] = useProjectsSearchParams()

但是此时返回数据的类型存在着问题

const projectParam: ((params: Partial<{
    name: unknown;
    personId: unknown;
}>) => void) | {
    personId: number | undefined;
    name: string;
}

const setParam: ((params: Partial<{
    name: unknown;
    personId: unknown;
}>) => void) | {
    personId: number | undefined;
    name: string;
}

projectParamsetParam都是联合类型,这是因为Ts推断你返回的是一个数组类型,数组中的类型可以是像projectParam的对象类型数据,也可以是像setParam的函数类型数据


【例子】

let  a = 1 // number 类型
let b = 'qwe' // string 类型
const m = [a,b] // (string | number)[]类型
let [q,w] = m // q: string | number ;w: string | number

在js中数组中的各个元素的类型是可以不相同的,(string | number)[]表示

该数组中的数据为string类型或number类型

那么通过解构得到的数据,被Ts推断为string | number类型


使用 as const

使用as const可以将这个表达式推断为最具体的类型

import { useUrlQueryParam } from "utils/url"

export const useProjectsSearchParams = () => {
    const [param,setParam] = useUrlQueryParam(['name','personId'])
    return [
        {...param, personId:Number(param.personId) || undefined},
        setParam
    ] as const
}

具体的类型推断

const projectParam: {
    readonly personId: number | undefined;
    readonly name: string;
}

const setParam: (params: Partial<{
    name: unknown;
    personId: unknown;
}>) => void
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 当你使用 `const` 关键字声明一个变量时,TypeScript 会自动推断该变量的类型为它的初始值的类型。但是,有时候你可能需要明确告诉 TypeScript 这个变量的类型,这时候就可以使用 `const` 断言。 `const` 断言的语法是在变量名后面加上 `as const`,例如: ```typescript const myArray = [1, 2, 3] as const; ``` 这里的 `as const` 告诉 TypeScript,`myArray` 变量的类型应该是一个只读的元组类型,其中包含了数字 1、2 和 3。 使用 `const` 断言可以帮助你更好地控制变量的类型,避免出现类型错误。 ### 回答2: TS中的const断言可用于声明一个变量或常量,用于告诉编译器该变量的值是不可变的。 在使用const断言时,我们需要通过以下方式声明变量或常量: 1. 变量声明 通过使用const关键字和断言符号`as const`,可以将一个变量声明为只读,并且该变量的类型将会被推断为具体的字面量值。 ```typescript const name = 'John' as const; const age = 30 as const; const person = { name: 'John', age: 30 } as const; ``` 在上述代码中,name和age都被声明为只读的字面量值,而person对象的属性也会被推断为只读的字面量值。 2. 类型断言 在类型断言中同样可以使用const关键字和断言符号`as const`,将一个变量的类型断言为只读的字面量值类型。 ```typescript const myValue = 'hello' as const; const myArray = [1, 2, 3] as const; const myObject = { name: 'John', age: 30 } as const; ``` 这里的myValue被断言为只读的字符串字面量类型,myArray断言为只读的元素为数字的元组类型,而myObject的属性则被断言为只读的字面量值类型。 使用const断言有助于约束变量或常量的值不可被修改,从而提高代码的可维护性和健壮性。需要注意的是,const断言只在编译阶段起作用,在运行时会被移除,并不会真正阻止对变量的修改。 ### 回答3: 当我们使用TypeScript时,有时候我们希望将一个变量声明为只读,即不允许被重新赋值。这时候可以使用const断言来实现。 const断言可以在声明变量时使用,通过在变量名前加上const关键字,告诉TypeScript编译器,该变量是只读的。例如: ```tsx const num: number = 10; ``` 在上面的例子中,我们声明了一个名为num的变量,并指定了其类型为number。由于使用了const断言,该变量在声明后就不能再被重新赋值,否则会报错。换句话说,我们只能在声明时对其进行赋值,不能在其他地方修改其值。 需要注意的是,const断言只能用于字面量类型的变量,而不能用于其他类型的变量。例如: ```tsx const name: string = "John"; // 正确使用const断言 const age: number = 20; // 错误,const断言不能用于非字面量类型 ``` 另外,使用const断言声明的变量,可以使用常见的JavaScript操作符对其进行操作,比如加法、减法等。但需要注意的是,对于常量对象或数组来说,虽然不能通过重新赋值来修改其值,但可以通过修改其属性或索引来修改其中的内容。例如: ```tsx const person: { name: string, age: number } = { name: "John", age: 20 }; person.age = 25; // 正确,修改属性值 person = { name: "Mike", age: 30 }; // 错误,重新赋值会报错 const numbers: number[] = [1, 2, 3]; numbers[0] = 10; // 正确,修改数组元素 numbers.push(4); // 正确,向数组添加元素 numbers = [1, 2, 3, 4]; // 错误,重新赋值会报错 ``` 总之,const断言可以用来声明只读的变量,使其值在声明后不能被重新赋值。但对于常量对象或数组来说,可以通过修改其属性或索引来修改其中的内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值