简介
类型断言本质就是替代编译器的类型推断,手动指定类型,让编译器按照你断言的类型进行后续的推断;简而言之,就是类型断言可以用来避免编译错误的;
上述说法与类型转换类似,但有着本质区别,类型断言是对于编译阶段而言的,告诉编译器如何分析代码,类型转换则是运行时发生的;
类型断言应该小心谨慎的使用,其并不能保证运行时的类型安全。如果执行类型断言后,实际的类型与预期类型不匹配,那么就会出现运行时错误。
类型断言并不能把某个值断言为任意类型,是存在一定的条件的:类型断言要求实际类型与断言类型兼容,实际类型可以断言为一个更加宽泛的类型(父类型),也可以断言为一个更加精确的类型(子类型),但不能断言为一个完全无关的类型。这是为了在进行类型断言时提供额外的安全性,完全毫无根据的断言是危险的;
当然如果你想断言成一个完全无关的类型,可以进行两次连续类型断言,先断言成 unknown 类型或 any 类型,然后再断言为目标类型。因为any
类型和unknown
类型是所有其他类型的父类型,所以可以作为两种完全无关的类型的中介。基本格式为 : expr as unknown as T
语法
类型断言有两种语法:
- 语法一:<类型>值 (前置形式)
<Type>value
- 语法二:值 as 类型 (后置形式)
value as Type
注意第一种语法跟 JSX存在冲突,故为了兼容性,推荐第二种;
例如:
const a = 'test';
const b: number = (<string>a).length;
const c: number = (a as string).length;
as const
断言
as const
断言作用是将字面量的类型断言为不可变类型,且
只能用于字面量,不能用于变量和表达式;
let a = 'test' as const;
a = 'abc'; // 报错
let b = 'qwerty';
let c = a as const; // 报错
非空断言
告知编译器,一个变量不会为 null
或 undefined,或者
某个对象的某个key
一定存在;
let a: number | null = null;
// 在某个时刻 a 被赋值为一个非 null 值
a = 10;
// 使用非空断言来确保 a 不是 null,将a! 类型缩窄为 number
let b: number = a!;