作用: 手动指定一个值的类型;
语法:value as type;
注意:类型断言只能够「欺骗」TypeScript 编译器,无法避免运行时的错误,反而滥用类型断言可能会导致运行时错误;
使用时机:当某个值可能不明确类型时,为其指定一个明确的类型,从而可以使用指定这个类型的方法和属性;
使用的几个场景:
- 联合类型可以被断言为其中一个类型
interface a {
name: string,
run(): Function
}
interface b {
name: string,
say(): Function
}
function c(x: a | b) {
x.name = 'name'; // 共有属性,不会报错
// say仅b才有的属性,直接使用会报错,需要先断言为b才能正常使用;
// 注意如果此时传入为a则会在运行时报错,欺骗了TS过了编译;
(x as b).say();
}
- 父类可以被断言为子类
interface father {
name: string,
}
interface sun extends father{
age: number
}
function a(x: father) {
(x as sun).age = 10;
}
- 任何类型都可以被断言为 any
// TS的意义为为每个值确定明确的类型,此方式可能会忽略一些类型的错误,非必需尽量少用;
// window 上 无 a的属性或者方法,直接只用会报错,此时可以使用断言为any类型;
(window as any).a = '1';
- any 可以被断言为任何类型
// 防止衍生出更多的any类型;
function a(x: string): any {
return false;
}
interface b {
name: string,
run(): number,
}
const c = a('1') as b;
c.run();