never
不存在值的类型。TS 2.0 引入。
通常情况下,一个变量被申明,若是没有特别指定,也会被初始化为 undefined 类型。这种类型就是特意用来标注这个变量,这个函数的返回没有值的,见一个例子
function throwErr (msg: string): never {
throw new Error(msg)
function generateErr(num: number): never {
if (num > 1) {
throw new Error()
} // 报错: 返回“从不”的函数不能具有可访问的终结点。ts(2534)
如上的函数恒抛出错误,永远不会有返回值,所以可以定义为 never。而有条件能返回哪怕是 undefined 值的,也不能定义为 never。
除了 never 类型外,其他类型均不能给 never 类型的定义赋值。
never 是所有类型的子类型,可以给所有类型赋值,但前提是 tsconfig 里开启 "strictNullChecks": false
不允许执行变量的方法以及访问内部属性
// 1.
let test: never
test = {} // 报错: 不能将类型“{}”分配给类型“never”。ts(2322)
test = 1 // 报错: 不能将类型“{}”分配给类型“never”。ts(2322)
test = '123' // 报错: 不能将类型“{}”分配给类型“never”。ts(2322)
test = true // 报错: 不能将类型“{}”分配给类型“never”。ts(2322)
// 2.
function add(num1: number, num2: number) {
return num1 + num2
add(test, test)
// 3.
test.a.b = 1 // 报错: 类型“never”上不存在属性“a”。ts(2339)