建议采用哪种方法与TypeScript中的模式匹配类似?到目前为止,我所做的最好的事情是为每个tupled接口提供唯一的"tag"
值,并根据它进行切换/ case -statement。
interface First { tag: 'one' }
interface Second { tag: 'two' }
type Third = First | Second
function match<T>(input: Third): T {
switch( input.tag ){
case 'one': {
...
}
case 'two': {
...
}
default: {
...
}
}
}
在我看来,这仍然是一种不友好和非生产性的方法。
由于TypeScript不是一流打字,我不太清楚自己能推出多远,但我想尝试一下。
答案 0 :(得分:2)
也许使用枚举这个
enum Tag {
One,
Two,
Three
}
interface Taggable {
tag: Tag
}
interface Alpha extends Taggable {
tag: Tag.One
a: number
}
interface Bravo extends Taggable {
tag: Tag.Two
b: number
}
function match<gTaggable extends Taggable = Taggable>(
taggable: gTaggable
): gTaggable {
switch(taggable.tag) {
case Tag.One: {
const {tag, a} = taggable
// ...
break
}
case Tag.Two: {
const {tag, b} = taggable
// ...
break
}
default: {
throw new Error(`unknown taggable "${taggable.tag}"`)
}
}
}
如果你觉得特别顽皮,你可以看看使用符号代替枚举这样的东西