TypeScript 系列 - any 类型,unknown 类型,never 类型

107 阅读2分钟

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 类型
  }
}