类型断言好比其他语言中的类型转换,但是不是真正的类型转换方式,之所以不被称为类型转换,是因为转换通常意味着某种运行时的支持。但是,类型断言纯粹是一个编译时语法,同时,它也是一种为编译器提供关于如何分析代码的方法。
理解:就是让ts编译顺利通过
1、原则
- 联合类型可以被断言为其中一个成员类型
- 父类可以被断言为子类
- 任何类型都可以被断言为 any
- any 可以被断言为任何类型
- 要使得 A 能够被断言为 B,只需要 A 兼容 B 或 B 兼容 A 即可
2、类型断言有两种形式
2.1 尖括号
let someValue: any = 'this is a string';
let strLen: number = (<string>someValue).length;
2.2 as语法
let someValue: any = 'this is a string';
let strLen: number = (someValue as string).length;
两种形式是等价的,但是如果在ts中使用了jsx语法的话,只能使用 as 语法。
2.3、 非空断言
后缀表达式操作符 ! 可以用于断言操作对象是非 null 和非 undefined 类型。具体而言,x! 将从 x 值域中排除 null 和 undefined 。
1)忽略undefined和null类型:
2)函数调用时忽略undefined类型:
3)非空断言只是让ts编译通过,在生成的js代码中,会移除非空断言的相关代码,所以在实际使用的过程中,要特别注意。
生成的js代码: