如何在TypeScript中模拟ADT和模式匹配?

thS*_*oft 10 pattern-matching algebraic-data-types typescript

不幸的是,从0.9.5开始,TypeScript(尚未)具有代数数据类型(联合类型)和模式匹配(用于解构它们).更重要的是,它甚至不支持接口上的instanceof.您使用哪种模式来模拟具有最大类型安全性和最小样板代码的这些语言功能?

thS*_*oft 6

我去下面访问者状图案,通过激发(在本例中,Choice可以是FooBar):

interface Choice {
    match<T>(cases: ChoiceCases<T>): T;
}

interface ChoiceCases<T> {
    foo(foo: Foo): T;
    bar(bar: Bar): T;
}

class Foo implements Choice {

    match<T>(cases: ChoiceCases<T>): T {
        return cases.foo(this);
    }

}

class Bar implements Choice {

    match<T>(cases: ChoiceCases<T>): T {
        return cases.bar(this);
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

function getName(choice: Choice): string {
    return choice.match({
        foo: foo => "Foo",
        bar: bar => "Bar",
    });
}
Run Code Online (Sandbox Code Playgroud)

匹配本身具有表现力和类型安全性,但是要为类型编写很多样板文件.


thS*_*oft 3

TypeScript 1.4 添加了联合类型和类型保护