TypeScript - Never
never 类型
TypeScript 中的 never 类型表示永远不会发生的值。例如,抛出错误的函数的返回类型就是 never。
function funcName(): never{
// 它会抛出异常或永远不返回
}
不能将值赋值给 never 类型的变量
let x: never; x = 10; // 抛出错误
上述 TypeScript 代码片段将抛出以下错误
Type 'number' is not assignable to type 'never'.
可以将 never 类型用作永远不返回或总是抛出异常的函数的返回类型。
一个永远停止执行的函数
function infiniteLoop(): never{
for(;;){}
}
另一个永远停止执行的函数示例
function infiniteLoop(): never{
while (true) {
}
}
当变量被任何永远不可能为 true 的 type guards 缩小类型时,也会获得 never 类型。
当我们穷尽了所有可能的值且没有值可以赋值时,就使用 never 类型。
function check(value: string | number) {
if (typeof value === 'string') {
return "value is string";
} else {
return "value is number";
}
// 在这里,不是 string 或 number
// "value" 在这里不可能发生,因此其类型为 "never"
}
never 类型是每个类型的子类型,并且可以赋值给每个类型;但是,没有类型是 never 的子类型或可以赋值给 never(never 本身除外)。即使 any 也不能赋值给 never。
可以为变量标注 never 类型,但这种情况非常少见
function showError(): never{
throw new Error("Error message from function with never as return type.");
}
let x: never = showError();
在上述 TypeScript 代码片段中,变量 x 被标注为 never 类型。变量 x 被赋值为 showError() 函数,该函数本身的返回类型为 never。
void 与 never 的区别
在 TypeScript 中,void 类型的变量可以存储 undefined 值。另一方面,never 无法存储任何值。
let val1: void = undefined; let val2: never = undefined; // 错误:Type 'undefined' is not assignable to type 'never'.
我们知道,如果 TypeScript 中的函数不返回任何值,它会返回 undefined。我们通常将此类函数的返回类型标注为 void。请看下面的示例,
function greet(): void{
console.log("Welcome to ");
}
let msg: void = greet();
console.log(msg);
在上面的示例中,我们定义了一个不返回任何值的函数 greet()。当我们调用该函数时,返回值为 undefined。
编译后,将生成以下 JavaScript 代码。
function greet() {
console.log("Welcome to ");
}
let msg = greet();
console.log(msg);
上述代码的输出如下
Undefined