解释 TypeScript 中 never 类型的用途

typescriptserver side programmingprogramming

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

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

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

语法

用户可以按照以下语法将 never 类型用作变量的文字。

// never 类型作为变量文字
let variable: never;

// never 类型为函数返回类型
function func(): never {

  // 编写任何条件,使函数不应返回任何值
}

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

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

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

// never 类型为变量文字
let variable: never;

// 以下代码生成错误消息,如"类型 'number' 不能分配给类型 'never'"。
// variable = 10;

// 初始化变量之前,我们无法打印变量。
// console.log(variable);

// 这不起作用,因为我们无法将值分配给 never 类型的变量
// let variable2: never = 10;

console.log("处理 never 类型的变量")

编译后,它负责生成以下 JavaScript 代码 -

// never 类型为变量文字
var variable;

// 以下代码生成错误消息,如"类型 'number' 不能分配给类型 'never'"。

// variable = 10;

// 初始化变量之前,我们无法打印变量。

// console.log(variable);

// 这不会起作用,因为我们无法将值分配给 never 类型的变量

// let variable2: never = 10;
console.log("处理 never 类型的变量");

上述代码将产生以下输出 −

输出

处理 never 类型的变量

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

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

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

// 定义示例函数,该函数永远不会返回值,也永远不会停止执行
function sample(param1: string): never {
  while (true) {
    console.log("The value of the param1 is " + param1);
  }
}

// 测试函数,将无限次返回 for 循环
function test(param2: number): never {
  for (let i = 0; ; ) {
    console.log("The value of param2 is " + param2);
  }
}

// 调用测试函数
test(20);

// 调用示例函数

// 示例函数永远不会被调用,因为测试函数永远不会停止
sample("Hello");

编译后,它负责生成以下 JavaScript 代码 -

// 定义示例函数,它永远不会返回值,也永远不会停止执行
function sample(param1) {
    while (true) {
      console.log("The value of the param1 is " + param1);
   }
}

// 测试函数,将返回无限时间的循环
function test(param2) {
   for (var i = 0;;) {
      console.log("The value of param2 is " + param2);
   }
}

// 调用测试函数
test(20);

// 调用示例函数

// 示例函数从未调用,因为测试函数永远不会停止
sample("Hello");

示例 3

在此示例中,我们创建了错误函数,该函数始终会抛出错误。因此,它永远不会从函数返回任何值。之后,我们从 sample() 函数调用 error() 函数。

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

//  始终抛出错误的函数
function error(): never {
  throw new Error("返回类型中的错误!");
}

// 从 sample() 函数调用 error() 函数
function sample() {
      return error();
}

sample();

编译后,它负责生成以下 JavaScript 代码 -

// 总是抛出错误的函数
function error() {
throw new Error("返回类型错误!");
}

// 从 sample() 函数调用 error() 函数
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 或 number 类型,而 var2 是 never 和 number 类型,这意味着 never 类型总是覆盖 number 类型。

示例 4

在下面的示例中,用户可以看到我们可以将 number 值分配给 var1,因为 number 类型覆盖了 never 类型。此外,我们不能将值分配给 var2,因为 never 类型覆盖了 number 数据类型。

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

// 我们可以为 var1 赋值,因为它是 number 类型
var1 = 30;

//  我们不能为 var2 赋值,因为它是 never 类型
// var2 = 30;

console.log("var1 的值为 " + var1);

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

var var1;
var var2;
// 我们可以给 var1 赋值,因为它是数字类型
var1 = 30;

// 我们不能给 var2 赋值,因为它是 never 类型

// var2 = 30;
console.log("var1 的值为 " + var1);

上面的代码将产生以下输出 -

var1 的值为 30

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


相关文章