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
相关产品推荐
相关产品推荐

