Skip to content

never 是什么类型,详细讲一下

Posted on:2024年9月4日 at 01:27

在 TypeScript 中,never 是一个特殊的类型,它表示“从不”发生的值。换句话说,never 类型用于表示那些不可能存在的值或永远不会完成的情况。它通常用于以下几种场景:

1. 不可能的返回值

never 类型常用于函数的返回类型,表示该函数不会正常返回。通常这种情况发生在函数抛出错误或者函数进入无限循环时。

示例

function throwError(message: string): never {
  throw new Error(message); // 函数抛出错误,不会返回任何值
}

function infiniteLoop(): never {
  while (true) {
    // 永远不会退出循环
  }
}

在上述示例中,throwError 函数会抛出一个错误,因此它不会正常返回到调用者,infiniteLoop 函数则会一直无限循环,也不会返回任何值。

2. 类型保护中的 never

never 类型也可以用于类型保护来确保所有可能的情况都被处理。常用于 switch 语句或其他条件语句中,确保每个分支都已被处理。

示例

type Animal = "dog" | "cat";

function getAnimalSound(animal: Animal): string {
  switch (animal) {
    case "dog":
      return "Woof!";
    case "cat":
      return "Meow!";
    default:
      // 确保所有可能的值都已处理
      const _exhaustiveCheck: never = animal;
      throw new Error(`Unhandled case: ${_exhaustiveCheck}`);
  }
}

在这个示例中,_exhaustiveCheck 被赋值为 animal,这是为了确保 switch 语句中的每个可能的分支都被处理。如果有遗漏,TypeScript 编译器将会报错。

3. 作为函数参数

never 类型也可以用于函数参数中,表示函数参数类型应该从不出现这种情况。例如,某些类型保护函数可以返回 never 来表示某种类型的不存在。

示例

function assertNever(x: never): never {
  throw new Error(`Unexpected value: ${x}`);
}

function handle(value: "a" | "b") {
  switch (value) {
    case "a":
      console.log("Handling 'a'");
      break;
    case "b":
      console.log("Handling 'b'");
      break;
    default:
      assertNever(value); // 如果 value 不是 "a" 或 "b",将会触发类型错误
  }
}
原文转自:https://fe.ecool.fun/topic/a38952da-3035-4553-95f6-1e2688ffeadc