有多种类型的实现,但仅根据Typescript中的条件使其中之一处于活动状态

时间:2019-10-28 04:32:36

标签: typescript interface conditional-types

试图弄清楚当给定类型具有多个实现并且在任何给定时间只有一个处于活动状态时,如何使编译器不会出错。

例如,我有以下两个接口:

interface fooA {
kind: 'fooA',
a: string,
b: string
c: string
}

interface fooB {
kind: 'fooB',
c: string
d: string,
e: string
}

export type IFoo = fooA | fooB

现在我的方法之一是处理作为参数传入的道具,并且在任何给定时间,这两个接口中只有一个是有效的,我希望打字稿仅针对当前处于活动状态的接口内部条件检测类型。 所以看起来像这样...

someClass {
  constructor(foo: IFoo){

    switch(foo.kind){
      case 'fooA': {
        // do something with params 
        console.log(`${foo.a}-${foo.b}-${foo.c}`)
        break;
      }
      case 'fooB': {
        // do something with params 
        console.log(`${foo.c}-${foo.d}-${foo.e}`)
        break;
      }
    }
  }
}

因此,通过此实现,我会收到错误消息:
 Property 'a' does not exist on type 'foo'. Property 'a' does not exist on type 'fooB'.ts(2339)
似乎很清楚fooB不具有属性a,但是可以使用Typescript配置多个基于条件的接口,因此接口fooA在第一种情况下是有效的,而fooB在第二种情况下处于活动状态。

2 个答案:

答案 0 :(得分:0)

您应该能够使用Typescript文档中有关Type Guards的方法之一。

使用类型谓词,或使用typeofinstanceofin,Typescript可以评估条件以缩小变量的可能类型。

>

答案 1 :(得分:0)

好的,所以我认为我已经解决了问题。问题是我的结构与上述类似,但在案例陈述中有错字。我猜还有一个不进行直接字符串比较的原因。 谢谢大家