如何在 类 中使用有区别的联合
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;
}
}
我正在尝试将可区分的联合转换为字符串。可区分联合由两个接口组成。如果我使用与其中一个接口匹配的简单对象调用该函数,我会得到预期的结果。如果我用 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;
}
}