在 Typescript 4.3 中,TypeScript 引入了 const
断言。const
断言用于告诉 TypeScript 编译器以下内容之一:
对象属性是只读的
将对象强制转换为 const
时,属性标记为只读,无法修改。
以下面的 person
变量为例,其中包含 name
和 age
。
const person = {
name: 'O.O',
age: 20
}
其类型按预期推断为 string
和 number
。
但如果我们将其断言为 const
,person
对象的推断类型将被标记为只读,并且无法修改。
const person = {
name: 'O.O',
age: 20
} as const
person.name = 'D.O' // TypeError
如果尝试更新 age
字段,则会抛出错误。
数组变成只读元组
数组上的 const
断言允许我们将数组标记为只读元组,即数组中每个位置的内容都成为无法修改的文本类型。
例如:
const arr = ['O.O', 20]
TypeScript 会将其推断为字符串或数字数组,即 (string | number)[]
。
但是,如果我们使用 as const
断言,它将被限制为只读元组,即第一个位置为 'O.O'
,第二个位置为 25
,并且它的值不能被修改:
const arr = ['O.O', 20] as const
arr[0] = 'D.O' // TypeError
变量值应被视为文字类型
文字类型允许我们定义更具体的类型,而不是像字符串或数字这样泛化的类型。例如:
type Switch = 'On' | 'Off'
const
断言允许我们将变量值标记为文字类型。例如,如果我们有一个变量 onSwitch
,并为其赋值为 On
,那么 TypeScript 通常会将变量的类型推断为字符串:
let onSwitch = 'On'
字符串
但是,如果我们使用 const
断言,它将被推断为 On
的文字类型:
let onSwitch = 'On' as const
文字类型
并且不能接受除 On
之外的任何其他变量:
onSwitch = 'Off' // TypeError
需要记住的一点是,const
断言只能应用于简单表达式。所以你不能这样做:
function switchValue(input: boolean) {
let onSwitch = (input ? 'On' : 'Off') as const // 行不通
return onSwitch
}
为了解决上述问题,我们需要对三元运算符的每个输出值应用 const
断言:
function switchValue(input: boolean) {
let onSwitch = input ? ('On' as const) : ('Off' as const)
return onSwitch
}
onSwitch
变量的类型被推断为一个文本类型联合 On | Off
。
通过使用 as const
语法告诉编译器将元组字面量的类型推断为元组字面量,而不是 string[]
。
const list = ['a', 'b', 'c'] as const
元组字面量
这种类型的断言导致编译器推断出一个值可能的最窄类型,包括将所有内容设为只读的。它应该如下所示:
type NeededUnionType = typeof list[number] // 'a'|'b'|'c'
只读联合类型
网友评论