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

TypeScript中switch-case的never穷尽检查是否有运行时用途?

TypeScript Switch-Case 穷尽检查:编译时保障与运行时风险

一、穷尽检查的核心作用是编译阶段校验

你理解的没错,这种通过never类型实现的穷尽检查,核心价值是在编译阶段发现未覆盖的分支:

  • 当Shape的所有可能类型都被case分支处理时,进入default的shape会被TypeScript推断为never类型,此时赋值给const _exhaustiveCheck: never = shape完全合法,编译通过。
  • 若后续给Shape新增了Triangle类型但没添加对应的case分支,shape在default里的类型就不再是never,TypeScript会直接抛出编译错误,强制你处理新分支。

二、default分支确实可能在运行时被执行

虽然穷尽检查是编译时手段,但编译后的JavaScript代码会保留default分支,以下场景会触发它:

  • 后端返回超出类型定义的数据:TypeScript类型只在编译期有效,运行时类型信息被擦除。如果后端接口返回了一个kind: "triangle"的对象,前端接收后传入getArea,就会走到default分支。
  • 手动绕过类型检查:比如用as any强制将一个不符合Shape类型的对象传入函数,比如getArea({ kind: 'triangle', side: 5 } as any),运行时会直接进入default。
  • 代码版本不一致:比如项目依赖的某个包更新后,新增了Shape的子类型,但你的代码没同步更新类型定义和case分支,运行时加载的JS代码会处理新增类型,触发default。

建议在default分支里加入运行时错误抛出,让异常更易排查:

default:
  const _exhaustiveCheck: never = shape;
  throw new Error(`Unknown shape type: ${shape.kind}`);

这样既能保留编译时的穷尽校验能力,又能在运行时快速发现非法输入。

内容的提问来源于stack exchange,提问作者Koenigsberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:57:08