You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求解析TypeScript never类型的适用场景与使用时机

TypeScript never 类型的实用场景与时机

never 是TypeScript里最“极端”的类型——它代表永远不会存在的值,或者说“不可能发生的情况”。下面结合实际代码,讲清楚它的核心用法:

1. 永远不会返回的函数

如果一个函数永远不会执行完(要么无限循环,要么抛出错误终止),它的返回值类型就是never。

  • 无限循环的函数:
function infiniteLoop(): never {
  while (true) {
    console.log("一直在跑...");
  }
}

这类函数没有任何返回的可能,用never标注返回类型比void更准确(void表示函数执行完但没返回值,而never是函数根本不会执行完)。

  • 抛出错误的函数:
function throwError(message: string): never {
  throw new Error(message);
}

比如全局的错误处理函数,调用后直接终止程序,不会有返回值,用never能明确传达这个语义。

2. 联合类型的穷尽检查(最常用场景)

当你处理一个联合类型时,用never可以强制编译器帮你检查:所有可能的类型分支都被覆盖了,避免遗漏情况。

比如有一个联合类型的枚举:

type Fruit = "apple" | "banana" | "orange";

function getFruitPrice(fruit: Fruit): number {
  switch (fruit) {
    case "apple":
      return 5;
    case "banana":
      return 3;
    case "orange":
      return 4;
    // 如果漏掉某个Fruit分支,编译器会直接报错
    default:
      // 用never标记这个分支“理论上不可能走到”
      const _exhaustiveCheck: never = fruit;
      throw new Error(`未知水果:${_exhaustiveCheck}`);
  }
}

如果后续给Fruit新增类型(比如"grape"),编译器会立刻在default处报错,因为fruit无法赋值给never,提醒你必须新增对应的case分支。这是never在类型安全上最实用的地方。

3. 类型守卫的兜底逻辑

在使用typeof、instanceof等类型守卫后,用never处理那些“理论上不可能出现”的类型分支,确保类型判断没有遗漏。

type Value = string | number | boolean;

function handleValue(value: Value): void {
  if (typeof value === "string") {
    console.log("字符串:", value);
  } else if (typeof value === "number") {
    console.log("数字:", value);
  } else if (typeof value === "boolean") {
    console.log("布尔值:", value);
  } else {
    // 这里的value类型是never,说明前面的类型守卫已覆盖所有可能
    const _unreachable: never = value;
    throw new Error(`无法处理的类型:${_unreachable}`);
  }
}

如果以后Value新增类型(比如null),编译器会在else处报错,强制你补充对应的处理逻辑。

4. 标记不可能的状态

在状态机这类场景中,用never标记那些“不应该出现”的状态,避免非法状态被遗漏处理。

type OrderStatus = "pending" | "paid" | "shipped";

function updateOrderStatus(status: OrderStatus): void {
  switch (status) {
    case "pending":
      console.log("处理待支付订单");
      break;
    case "paid":
      console.log("处理已支付订单");
      break;
    case "shipped":
      console.log("处理已发货订单");
      break;
    default:
      const _invalidStatus: never = status;
      throw new Error(`无效订单状态:${_invalidStatus}`);
  }
}

一旦有非法状态传入(比如后端返回未定义的"cancelled"),编译器会提前发现问题,运行时也能抛出明确错误。


内容的提问来源于stack exchange,提问作者Syed Abu Hanifah Bin Syed Azmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:07:49