any 类型
- 出于特殊原因,需要关闭某些变量的类型检查,就可以把该变量的类型设为
any。 - 为了适配以前老的 JavaScript 项目,让代码快速迁移到 TypeScript,可以把变量类型设为
any
编译选项noImplicitAny,打开该选项,只要推断出any类型就会报错
污染问题
污染其他具有正确类型的变量,把错误留到运行时
let x:any = 'hello';
let y:number;
y = x; // 不报错
y * 123 // 不报错
y.toFixed() // 不报错
unknown 类型
为了解决any类型“污染”其他变量的问题
严格版的any
unknown类型的变量,不能直接赋值给其他类型的变量(除了any类型和unknown类型)。- 不能直接调用
unknown类型变量的方法和属性。 unknown类型变量能够进行的运算是有限的,只能进行比较运算(运算符==、===、!=、!==、||、&&、?)、取反运算(运算符!)、typeof运算符和instanceof运算符这几种,其他运算都会报错。
经过“类型缩小”,unknown类型变量才可以使用。
let a:unknown = 1;
if (typeof a === 'number') {
let r = a + 10; // 正确
}
never 类型
“空类型”的概念,即该类型为空,不包含任何值
never类型的使用场景,主要是在一些类型运算之中,保证类型运算的完整性
不可能返回值的函数,返回值的类型就可以写成 never
never类型的一个重要特点是,可以赋值给任意其他类型。
如果一个变量可能有多种类型(即联合类型),通常需要使用分支处理每一种类型。这时,处理所有可能的类型之后,剩余的情况就属于never类型。
function fn(x: string | number) {
if (typeof x === "string") {
// ...
} else if (typeof x === "number") {
// ...
} else {
x; // never 类型
}
}