断言
有些情况下,变量的类型对于我们来说是很明确,但是TS编译器却并不清楚,此时,可以通过类型断言来告诉编译器变量的类型,断言有两种形式:
第一种
const someValue: unknown = "this is a string";
const strLength: number = (someValue as string).length;
第二种
const someValue: unknown = "this is a string";
const strLength: number = (<string>someValue).length;
小结
断言的语法为 <类型名> xxx
或xxx as 类型名
。推荐始终用as语法,因为第一种语法无法在tsx文件使用,而且容易和泛型混淆。一般只有这几种场景需要使用类型转换:自动推断不准;TS报错,想不出更好的类型编写方法。
在使用断言进行类型转换时,应该遵守几个原则:
- 若要放松限制,只可放松到能运行的最严格类型上
- 如果不知道一个变量的精确类型,只标注到大概类型(例如 any[])也比 any 好
- 任何一段 “放飞自我”(完全没有类型覆盖)区代码不应超过 2 行,应在出现第一个可以确定类型的变量时就补上标注
!断言
! 的作用是断言某个变量不会是null/undefined
,告诉编译器停止报错。这里由用户确保断言的正确。 它和刚刚进入 EcmaScript语法提案 stage 3的 Optional Chaining 特殊不同。Optional Chaining特性可 以保证访问的安全性,即使在 undefined 上访问某个键也不会抛出异常。而,只是消除编译器报错,不会对运行时行为造成任何影响。
// TypeScript
mightBeUndefined!.a = 2
// 编译为
mightBeUndefined.a = 2
@ts-ignore
用于忽略下一行的报错,尽量少用。