使用 never 检查完整性
使用 never 确保处理所有联合类型分支
使用 never 检查完整性 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
欢迎
穷尽性检查使用 `never` 类型来确保联合类型的每种情况都得到处理。当您添加新的联合成员时,TypeScript 会准确指出需要更新代码的位置。
穷尽性问题
当您对联合类型使用 switch 却遗漏某种情况时,JavaScript 会静默地继续执行。TypeScript 可以通过 never 检查检测到这一问题。
type Shape = 'circle' | 'square';
function area(s: Shape): number {
if (s === 'circle') return 3.14;
if (s === 'square') return 1;
// What if we add 'triangle'?
}never 穷尽性模式
将剩余值赋给 `never`。如果 TypeScript 推断出的类型不是 never,说明您有一个未处理的情况。
function assertNever(x: never): never {
throw new Error('Unexpected value: ' + x);
}
function area(s: Shape): number {
switch (s) {
case 'circle': return 3.14;
case 'square': return 1;
default: return assertNever(s);
}
}添加新的联合成员
如果将 'triangle' 添加到 Shape 联合类型中,TypeScript 会在 `assertNever(s)` 处报错,提示您处理这个新情况。
type Shape = 'circle' | 'square' | 'triangle';
// Now TypeScript errors on assertNever(s) because s is 'triangle'
// — it's not never!内联 never 检查
您可以不使用辅助函数,直接进行内联穷尽性检查。
function handle(shape: Shape): string {
switch (shape.kind) {
case 'circle': return 'circle';
case 'square': return 'square';
default:
const _: never = shape; // Error if not exhaustive
throw new Error('Unknown shape');
}
}不使用 switch 的穷尽性检查
在 if/else 链中使用相同的技术。
function process(action: Action): void {
if (action.type === 'A') { /* ... */ }
else if (action.type === 'B') { /* ... */ }
else {
const _: never = action; // exhaustive
}
}泛型类型约束中的 never
never 是底部类型,在条件类型中很有用,可以表示不可能的分支。
type NonNullable<T> = T extends null | undefined ? never : T;
// Removes null and undefined from T使用 never 表示不可能的状态
never 适合用于在类型系统中建模本应不可能出现的状态。
type State<T> =
| { kind: 'loading' }
| { kind: 'success'; data: T }
| { kind: 'error'; msg: string };
// There should never be a state with kind: 'unknown'条件类型中的 never
never 用于条件类型中,以筛除不需要的类型成员。
type NonFunctions<T> = {
[K in keyof T]: T[K] extends Function ? never : K
}[keyof T];
// Returns keys whose values are not functionsnever 在联合类型中传播
never 是联合类型的恒等元素——T | never = T。
type T = string | never; // string
type U = never | number | never; // numberassertNever 辅助函数
每个 TypeScript 项目都应有一个简单的 assertNever 工具函数,用于进行穷尽性检查。
function assertNever(value: never, message?: string): never {
throw new Error(message ?? `Unhandled: ${JSON.stringify(value)}`);
}快速检查
如果 `s` 仍然包含一个未处理的可能类型,那么在 `default: assertNever(s)` 这一行会发生什么?
回顾
在 switch 的 default 分支中使用 assertNever(x: never),这样当联合成员未被处理时,编译器就会报错。这可以确保随着联合类型不断扩展,您的代码仍然正确。
常见问题解答
「使用 never 检查完整性」课时是免费的吗?
是的 — 「使用 never 检查完整性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「使用 never 检查完整性」这节课中我会学到什么?
使用 never 确保处理所有联合类型分支 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 never 检查完整性」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- typeof 与真值收窄
- instanceof 与 in 收窄
- 用户自定义类型守卫函数
- 使用 never 检查完整性