穷尽式 switch 与 never 检查
使用 switch 编写覆盖所有联合情况的代码,并通过 never 捕获遗漏分支;构建安全的 assertNever 辅助函数。
穷尽式 switch 与 never 检查 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 3 节课。
简介
目标:对联合类型执行穷尽式分支处理,并使用never在编译时捕获遗漏的情况。
穷尽式分支
带判别的联合类型使用共同的类别字段。根据该字段进行分支处理,可以安全地收窄每种情况。
type Circle = { kind: "circle"; radius: number }
type Square = { kind: "square"; size: number }
type Shape = Circle | Square
function area(s: Shape): number {
switch (s.kind) {
case "circle":
return Math.PI * s.radius * s.radius
case "square":
return s.size * s.size
}
}联合类型扩展时
添加新成员(例如 triangle)后,我们会使用 never 捕获它,这样跳过的情况就不会悄悄产生错误。
type Triangle = { kind: "triangle"; base: number; height: number }
// If we extend Shape but forget to add case, we want a compile-time error
// type Shape = Circle | Square | TriangleassertNever
assertNever 的参数必须是 never 类型,这样当新变体落入默认分支时,就会产生编译错误。
function assertNever(x: never): never {
throw new Error(`Unhandled case: ${String(x)}`)
}
function areaSafe(s: Shape): number {
switch (s.kind) {
case "circle":
return Math.PI * s.radius * s.radius
case "square":
return s.size * s.size
default:
return assertNever(s) // if Shape grows, compiler errors here
}
}字面量联合类型
字符串字面量联合类型也适用相同的模式:覆盖每个可能的值,并在默认分支调用 assertNever。
type Status = "idle" | "loading" | "success" | "error"
function toIcon(s: Status) {
switch (s) {
case "idle": return "⏸"
case "loading": return "⏳"
case "success": return "✅"
case "error": return "⚠️"
default: return assertNever(s)
}
}
// Alternative: const check
const _check: never = ((): Status => "idle")() as never // force compile-time check with care提示
提示:启用 noFallthroughCasesInSwitch;优先使用带判别的联合类型;默认分支只用于 assertNever。
// Tips
// - Enable noFallthroughCasesInSwitch in tsconfig for safer switches
// - Prefer discriminated unions over boolean flags
// - Keep default branch only to call assertNever; avoid swallowing casesassertNever 检查
快速检查:在穷尽式分支中,assertNever 的作用是什么?
回顾
回顾:带判别的联合类型 + 穷尽式分支 = 更安全的代码。never 和 assertNever 会在编译时捕获遗漏的情况。
常见问题解答
「穷尽式 switch 与 never 检查」课时是免费的吗?
是的 — 「穷尽式 switch 与 never 检查」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 3 节课。
「穷尽式 switch 与 never 检查」这节课中我会学到什么?
使用 switch 编写覆盖所有联合情况的代码,并通过 never 捕获遗漏分支;构建安全的 assertNever 辅助函数。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。
「穷尽式 switch 与 never 检查」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 穷尽式 switch 与 never 检查
- 谓词函数与 satisfies 运算符
- 跨函数边界细化联合类型