Skip to content

类型断言

简介

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是类型断言,它们必须满足下面的条件:exprT的子类型,或者Texpr的子类型。

typescript
const n = 1

const s = n as string // Type 'number' is not assignable to type 'string'.

const a = n as any // 可以但不推荐

上例中,nnumber类型,string不是number的子类型,所以n as string是不允许的,但所有类型都是any的子集,所以如果想跳过编辑器的检查,断言成any是最直截了当的,但不推荐。

非空断言

有时候,开发者明确知道某个变量不会为空,但编译器并不知道,这时候就需要使用非空断言,写法是在变量名后面加上!

typescript
const myBtn = document.querySelector('btn')

// 告诉编译器一定有myBtn元素
myBtn!.addEventListener('click', () => {
  console.log('btn click')
})