TypeScript 使用 never 关键字来表示逻辑上不应该发生的情况和控制流,即不应该存在的状态。
可能出现 never 的情况
函数抛出一个错误异常
1
2
3const error = () => {
throw new Error('error')
}函数包含一个无限循环
1
2
3const loop = () => {
while(true) {}
}类型判断或类型缩小的细化(全面性检查)
在条件语句中,如果 TypeScript 能够推断出某个分支永远不会执行,那么该分支的类型会被推断为
never1
2
3
4
5
6
7const isTrue = (val: 'A' | 'B') => {
switch(val) {
case 'A': break;
case 'B': break;
default: const isFalse: never = val
}
}
never 和 void 的区别
如果没有为函数指定返回类型,并且在代码中没有返回任何内容,TypeScript 将推断其返回类型为
void。在TypeScript中,不返回任何内容的 void 函数实际上返回的是 undefined。void类型的值可以是undefined或null1
2const fn = () => {}
console.log(fn()) // undefined不能将 void 指定给 never
1
2const fn = () => {} // const fn: () => void
let aa: never = fn() // 不能将类型“void”分配给类型“never”
never 类型的特点
never 类型会从联合类型中移除
1
2
3
4
5
6type a = unknown | never // unknown
type b = any | never // any
type c = number | never // number
type d = string | never // string
type e = object | never // object
type f = boolean | never // booleannever 类型与任意类型的交叉类型都是 never
1
2
3
4
5
6type g = unknown & never // never
type h = any & never // never
type i = number & never // never
type j = string & never // never
type k = object & never // never
type l = boolean & never // nevernever 可以赋值给任意类型
1
2
3
4
5
6
7let m: never
let n: unknown = m
let o: any = m
let p: number = m
let q: string = m
let r: object = m
let s: boolean = m其他类型不能赋值给 never
1
2
3
4let t: never = 'a' // 不能将类型“string”分配给类型“never”
let u: never = 123 // 不能将类型“number”分配给类型“never”
let v: never = { a: 1 } // 不能将类型“{ a: number; }”分配给类型“never”
let w: never = true // 不能将类型“boolean”分配给类型“never”