如何在 类 中使用有区别的联合

How to use discriminated unions with classes

我正在尝试将可区分的联合转换为字符串。可区分联合由两个接口组成。如果我使用与其中一个接口匹配的简单对象调用该函数,我会得到预期的结果。如果我用 class 调用函数 实现 接口,我会得到 undefined 返回。你能向我解释一下这种行为吗?有什么解决办法吗?

interface Foo {
    kind: 'pending',
    myVar: string
}

interface Bar {
    kind: 'running',
    myVar2: string
}

type FooBarUnion = Foo|Bar;

class FooClass implements Foo {
    kind: 'pending'
    myVar: string

    constructor(text) {
        this.myVar = text;
    }
}

function fbuToString(o: FooBarUnion ) {
    switch (o.kind) {
        case "pending": return `O is pending. ${o.myVar}`;
        case "running": return `O is running. ${o.myVar2}`;
    }
}

// prints undefined
console.log(fbuToString(new FooClass('test')));

// prints expected result
console.log(fbuToString({kind:'pending', myVar: 'test'}));

我 运行 这个文件 ts-node filename.ts

你只是在 kind 中声明 class 你实际上并没有分配它

class FooClass implements Foo {
    kind = 'pending' as const
    myVar: string

    constructor(text:string) {
        this.myVar = text;
    }
}

Playground Link