TypeScript 的 never 类型是一种特殊的类型,它表示的是那些永远不存在的值的类型。例如,一个抛出异常或无限循环的函数的返回值类型就是 never,因为它们永远不会返回任何值。never 类型是所有类型的子类型,也就是说,任何类型都可以赋值给 never 类型,但是 never 类型只能赋值给自己和 any 类型。never 类型有以下的特点和用途https://juejin.cn/post/7201048368389914682:
• never 类型不能被实例化,也不能有任何值,甚至 undefined 也不行。
• never 类型可以用来表示不可能发生的情况,例如在 switch 语句中的 default 分支,或者在类型保护中排除掉所有可能的情况。
• never 类型可以用来进行疲劳性检查(exhaustiveness check),也就是检查是否所有的分支都被覆盖到了,如果有遗漏,就会报错。
下面是一些使用 never 类型的例子:
// 抛出异常的函数的返回值类型是 never
function throwError(message: string): never {
throw new Error(message);
}
// 无限循环的函数的返回值类型也是 never
function loopForever(): never {
while (true) {}
}
// 使用 never 类型来表示不可能发生的情况
type Direction = "up" | "down" | "left" | "right";
function move(direction: Direction) {
switch (direction) {
case "up":
// do something
break;
case "down":
// do something
break;
case "left":
// do something
break;
case "right":
// do something
break;
default:
// 如果有遗漏的情况,就会报错
const invalid: never = direction;
// Error: Type 'string' is not assignable to type 'never'
}
}
// 使用 never 类型来进行疲劳性检查
class ExhaustiveError extends Error {
constructor(value: never, message?: string) {
super(message);
}
}
function checkExhaustive(value: Direction) {
switch (value) {
case "up":
// do something
break;
case "down":
// do something
break;
default:
// 如果有遗漏的情况,就会抛出异常
throw new ExhaustiveError(value);
// Error: Argument of type 'string' is not assignable to parameter of type 'never'
}
}