解释 TypeScript 中 never 类型的用途


TypeScript 是一种类型严格的语言,我们需要为每个变量定义类型。此外,我们还需要定义函数的返回值类型以及函数参数的类型。

never 也是 TypeScript 中的一种类型,就像其他数据类型(如字符串、数字、布尔值、符号等)一样。我们可以使用 `never` 关键字来创建一个 never 类型的变量。

用户可以在确信任何情况永远不会发生时使用 never 类型。例如,当我们确定函数永远不会返回值时,可以使用 never 作为返回值类型。

语法

用户可以按照以下语法使用 never 类型作为变量的字面量。

// never type as a variable literal
let variable: never;

// never type as a function return type
function func(): never {

   // write any condition such that the function shouldn't return any value
}

在上述语法中,变量类型为 never,这意味着我们永远无法向变量存储任何值。此外,函数的返回值类型为 never,这意味着我们永远无法从函数返回值。

示例 1:使用 never 关键字作为字面量

在下面的示例中,我们定义了变量并使用 never 关键字作为字面量。之后,用户可以看到我们无法为 never 类型的变量赋值。如果尝试为 never 类型的变量赋值,TypeScript 编译器会生成错误。

// never type as a variable literal
let variable: never;

// The below code generates the error message like Type 'number' is not assignable to type 'never'. 
// variable = 10;

// we can't print the variable before initializing it.
// console.log(variable);

// This will not work as we can't assign the value to the variable of never type
// let variable2: never = 10;

console.log("Working the variable of type never")

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

// never type as a variable literal
var variable;

// The below code generates the error message like Type 'number' is not assignable to type 'never'. 

// variable = 10;

// we can't print the variable before initializing it.

// console.log(variable);

// This will not work as we can't assign the value to the variable of never type

// let variable2: never = 10;
console.log("Working the variable of type never");

以上代码将产生以下输出:

输出

Working the variable of type never

示例 2:使用 "never" 作为函数的返回值类型

在下面的示例中,我们创建了 `sample` 和 `test` 函数。`sample` 函数无限次运行 while 循环,并且永远不会停止。`test` 函数也无限次运行 for 循环,因此它永远不会返回值,我们可以使用 never 作为函数的返回值类型。

此外,用户可以看到 TypeScript 永远不会调用 `sample()` 函数,因为 `test()` 函数的执行永远不会停止。

// defining the sample function, which never returns a value and never stops execution
function sample(param1: string): never {
   while (true) {
      console.log("The value of the param1 is " + param1);
   }
}

// test function, which will return for loop for infinite time
function test(param2: number): never {
   for (let i = 0; ; ) {
      console.log("The value of param2 is " + param2);
   }
}

// calling the test function
test(20);

// calling the sample function

// sample function never invoked, as the test function will never stop
sample("Hello");

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

// defining the sample function, which never returns a value and never stops execution
function sample(param1) {
    while (true) {
      console.log("The value of the param1 is " + param1);
   }
}

// test function, which will return for loop for infinite time
function test(param2) {
   for (var i = 0;;) {
      console.log("The value of param2 is " + param2);
   }
}

// calling the test function
test(20);

// calling the sample function

// sample function never invoked, as the test function will never stop
sample("Hello");

示例 3

在这个示例中,我们创建了 `error` 函数,它总是抛出错误。因此,它永远不会从函数返回值。之后,我们从 `sample()` 函数调用了 `error()` 函数。

在输出中,用户可以看到以下代码显示错误。

//  function that always throws an error
function error(): never {
   throw new Error("Errors in the return type!");
}

// calling the error() function from the sample() function
function sample() {
   return error();
}

sample();

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

//  function that always throws an error
function error() {
   throw new Error("Errors in the return type!");
}

// calling the error() function from the sample() function
function sample() {
   return error();
}
sample();

以上代码将产生以下输出:

输出

Error: Errors in the return type!

将 never 类型与其他数据类型联合或交叉使用

我们可以将 never 类型与其他数据类型(如数字、字符串或布尔值)一起用作字面量。如果我们获取 never 类型和数字类型的联合,则变量变为数字类型。

如果我们获取 never 类型和数字类型的交叉,则 never 类型始终覆盖,并且变量变为 never 类型。

语法

用户可以按照以下语法使用 never 类型作为其他数据类型的联合和交叉。

let var1: never | number;
let var2: never & number;

在上述语法中,`var1` 既可以是 never 类型也可以是数字类型,而 `var2` 是 never 类型和数字类型的交叉,这意味着 never 类型始终覆盖数字类型。

示例 4

在下面的示例中,用户可以看到我们可以为 `var1` 分配数字值,因为数字类型覆盖了 never 类型。此外,我们无法为 `var2` 分配值,因为 never 类型覆盖了数字数据类型。

let var1: never | number;
let var2: never & number;

// we can assign value to the var1 as it is a type of number
var1 = 30;

//  we can't assign value to the var2 as it is a type of never
// var2 = 30;

console.log("The value of var1 is " + var1);

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

var var1;
var var2;
// we can assign value to the var1 as it is a type of number
var1 = 30;

//  we can't assign value to the var2 as it is a type of never

// var2 = 30;
console.log("The value of var1 is " + var1);

以上代码将产生以下输出:

The value of var1 is 30

在本教程中,用户学习了 TypeScript 中的 never 类型。我们通过不同的示例了解了 never 类型的不同用例。当我们将 never 用作函数的返回值类型时,该函数应包含任何条件,这些条件永远不允许函数返回值。

更新于: 2023年1月17日

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告