Z
ZHANK
类型编程

可辨识联合类型

判别属性缩小联合、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);
}