0Pricing
TypeScript Academy · 课时

穷尽式 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 | Triangle

assertNever

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 cases

assertNever 检查

快速检查:在穷尽式分支中,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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 穷尽式 switch 与 never 检查
  2. 谓词函数与 satisfies 运算符
  3. 跨函数边界细化联合类型
← 返回 TypeScript Academy