利用单例类型实现穷举性联合类型判别器
通过字面量类型和never,构建一个确保所有分支都被处理的联合类型判别器,在编译阶段捕获遗漏的case。 · 难度:入门 · +10XP
利用单例类型实现穷举性联合类型判别器
在TypeScript中,switch语句可能遗漏某些联合类型成员。本教程展示如何通过类型守卫函数,结合单例类型和never,创建一个编译时强制穷举检查的判别器。当新的联合成员被添加时,必须更新所有相关处理函数,否则编译失败。这比eslint规则更强大,因为它是类型系统的一部分。
type Shape =
| { kind: 'circle'; radius: number }
| { kind: 'square'; side: number }
| { kind: 'triangle'; base: number; height: number };
function assertNever(x: never): never {
throw new Error('Unexpected shape');
}
function area(s: Shape): number {
switch (s.kind) {
case 'circle': return Math.PI * s.radius ** 2;
case 'square': return s.side ** 2;
case 'triangle': return (s.base * s.height) / 2;
default: return assertNever(s); // 如果未穷举则编译错误
}
}