解释在 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