类型断言
简介
TypeScript 提供了“类型断言”这样一种手段,允许开发者在代码中“断言”(关键字 as
)某个值的类型,告诉编译器此处的值是什么类型。
typescript
type T = 'a' | 'b' | 'c'
let foo = 'a'
let bar: T = foo // Type 'string' is not assignable to type 'T'.
let baz: T = foo as T // ✅
上述代码可以理解为:开发者告诉编译器:“没有人比我更懂我写的代码”,于是编译器答道:“额,好的 👌”(TypeScript 一旦发现存在类型断言,就不再对该值进行类型推断)
类型断言的约束条件
当然,类型断言并不代表开发者可以随意断言任何值的类型,它有一定的约束条件:
typescript
expr as T
expr
是实际的值,T
是类型断言,它们必须满足下面的条件:expr
是T
的子类型,或者T
是expr
的子类型。
typescript
const n = 1
const s = n as string // Type 'number' is not assignable to type 'string'.
const a = n as any // 可以但不推荐
上例中,n
是number
类型,string
不是number
的子类型,所以n as string
是不允许的,但所有类型都是any
的子集,所以如果想跳过编辑器的检查,断言成any
是最直截了当的,但不推荐。
非空断言
有时候,开发者明确知道某个变量不会为空,但编译器并不知道,这时候就需要使用非空断言,写法是在变量名后面加上!
。
typescript
const myBtn = document.querySelector('btn')
// 告诉编译器一定有myBtn元素
myBtn!.addEventListener('click', () => {
console.log('btn click')
})