📜  解释在 TypeScript 中从不输入的目的

📅  最后修改于: 2022-05-13 01:56:17.367000             🧑  作者: Mango

解释在 TypeScript 中从不输入的目的

在 Typescript 中,当我们确定某种特定情况永远不会发生时,我们使用 never 类型。例如,假设您构造了一个从不返回或总是抛出异常的函数,那么我们可以在该函数上使用 never 类型。 Never 是 TypeScript 中的一种新类型,表示永远不会遇到的值。

示例 1: null 可以分配给 void 但 null 不能分配给 never 类型变量,也不能分配任何其他类型,包括 any。

Javascript
let variable: void = null;
let variable1: never = null;      // error
let variable2: never = 1;         // error
let variable3: never = "geek";     // error
let variable4: never = true;     // error


Javascript
function infiniteLoop(): never {
  for (;;) {}
}
  
// Function call
infiniteLoop();


Javascript
function greet(): never {
  while (true) {
    console.log("hello");
  }
}
  
// Function call
greet();


Javascript
function throwTypeerror(str: string): never {
  throw new TypeError(str);
}
  
// Return type of this function is "never"
function func() {
  return throwTypeerror("a type error is being raised");
}
  
// Function call
func()


输出:任何其他类型的值都不能分配给 never 类型的变量。

error TS2322: Type 'null' is not assignable to type 'never'  ...
error TS2322: Type 'number' is not assignable to type 'never' ...
error TS2322: Type 'string' is not assignable to type 'never' ...
error TS2322: Type 'boolean' is not assignable to type 'never' ...

示例 2:在函数中使用 never type

返回“从不”的函数必须永远不会有端点,无限循环就是程序永远不会停止执行的这种情况的一个例子。在下面的代码中,有一个没有开头和结尾的 for 循环。我们没有得到任何输出。

Javascript

function infiniteLoop(): never {
  for (;;) {}
}
  
// Function call
infiniteLoop();

函数greet() 永远不会停止执行,它会持续显示“hello”并且它什么也不返回,所以从不使用 type。

Javascript

function greet(): never {
  while (true) {
    console.log("hello");
  }
}
  
// Function call
greet();

输出:正如所讨论的,只有在函数不返回任何内容或从不停止执行时才必须使用 never 类型,输出中的 hello 会无限重复。

hello
hello
hello
......

示例 3:在抛出异常的函数中使用 never 类型

在下面的代码中, throwTypeerror()函数什么都不返回,但会引发错误,因此函数的类型永远不会。 func()的类型也从不,因为它调用了throwTypeerror()函数,该函数不返回任何内容。

Javascript

function throwTypeerror(str: string): never {
  throw new TypeError(str);
}
  
// Return type of this function is "never"
function func() {
  return throwTypeerror("a type error is being raised");
}
  
// Function call
func()

输出: func()调用throwTyperror()函数,该函数抛出错误而不返回任何内容,因此这两个函数都是 never 类型。

throw new TypeError(str);
TypeError: a type error is being raised

参考: https://www.typescriptlang.org/docs/handbook/basic-types.html#never