类型编程
可辨识联合类型
判别属性缩小联合、never 穷举检查、Result/Option 模式
可辨识联合类型
用一个判别属性(discriminant)来区分联合类型中的每个成员——if/switch 后类型自动收窄,编译器 100% 覆盖。
学完本章你将: 掌握判别属性缩小联合、never 穷举检查、Result/Option 模式。
基本模式
typescript
type Shape =
| { kind: "circle"; radius: number }
| { kind: "rectangle"; width: number; height: number }
| { kind: "triangle"; base: number; height: number };
function area(shape: Shape): number {
switch (shape.kind) {
case "circle":
return Math.PI * shape.radius ** 2; // shape 自动收窄
case "rectangle":
return shape.width * shape.height;
case "triangle":
return (shape.base * shape.height) / 2;
}
}
never 穷举检查
typescript
function assertNever(x: never): never {
throw new Error(`Unexpected: ${x}`);
}
function area(shape: Shape): number {
switch (shape.kind) {
case "circle": return Math.PI * shape.radius ** 2;
case "rectangle": return shape.width * shape.height;
// case "triangle": 忘记处理三角形
default:
return assertNever(shape); // ❌ 编译错误!shape 不是 never
}
}
Result / Option 模式
typescript
type Result<T, E = Error> =
| { success: true; data: T }
| { success: false; error: E };
function divide(a: number, b: number): Result<number> {
if (b === 0) return { success: false, error: new Error("除零") };
return { success: true, data: a / b };
}
const result = divide(10, 2);
if (result.success) {
console.log(result.data); // 类型收窄
} else {
console.error(result.error.message);
}