TypeScript - never 类型



never 类型

TypeScript 中的 never 类型表示永远不会出现的数值。例如,抛出错误的函数的返回类型是 never。

function funcName(): never{
   // it throws an exception or never returns
}

你不能将值赋给 never 类型的变量 –

let x: never;
x = 10; // throw error

上面的 TypeScript 代码片段将抛出以下错误 –

Type 'number' is not assignable to type 'never'.

你可以使用 never 类型作为永远不会返回或总是抛出异常的函数的返回类型。

一个永远不会停止执行的函数 –

function infiniteLoop(): never{
   for(;;){}
}

另一个永远不会停止执行的函数示例 –

function infiniteLoop(): never{
   while (true) {
   }
}

当被任何永远不会为真的类型守卫缩小时,变量也会获得 never 类型。

当我们已经穷尽所有可能的值并且我们没有任何东西可以赋值时,使用 never 类型。

function check(value: string | number) {
    if (typeof value === 'string') {
        return "value is string";
    } else {
        return "value is number";
    }    
    // here, not a string or number
    // "value" can't occur here, so it's type "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 vs. never

在 TypeScript 中,void 类型的变量可以存储 undefined 作为值。另一方面,never 不能存储任何值。

let val1: void = undefined;
let val2: never = undefined; // error: Type 'undefined' is not assignable to type 'never'.

我们知道,如果 TypeScript 中的函数不返回值,则返回 undefined。我们通常用 void 来注释此类函数的返回类型。看下面的例子,

function greet(): void{
  console.log("Welcome to tutorials Point");
}
let msg: void = greet();
console.log(msg);

在上面的例子中,我们定义了一个不返回值的函数 greet()。当我们调用该函数时,返回值是 undefined。

编译后,它将生成以下 JavaScript 代码。

function greet() {
    console.log("Welcome to tutorials Point");
}
let msg = greet();
console.log(msg);

上述代码的输出如下:

Undefined
广告