TypeScript never 类型怎么用?啥时候返回 never?

文章导读
Previous Quiz Next never 类型 TypeScript 中的 never 类型表示永远不会发生的值。例如,抛出错误的函数的返回类型就是 never。
📋 目录
  1. never 类型
  2. void 与 never 的区别
A A

TypeScript - Never



Previous
Quiz
Next

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