在TypeScript

时间:2019-02-17 18:04:09

标签: typescript

所以这是我的问题,假设我有一些动物:

interface IAnimal {
   type: string;
   legs: number;
}

interface IChicken extends IAnimal {
   eggsPerDay: number;
}

interface ICow extends IAnimal {
   milkProduction: number;
}

...

doSomethingWithAnimal(animal: IChicken|ICow): void {
    switch(animal.type){
        case 'cow':
            alert(`the milk production is ${animal.milkProduction}`);
    }
}

我遇到的问题是打字稿,不知道是牛还是鸡。一旦确定动物是ICow类型,是否可以安全地访问这些附加属性?

我知道可以进行const cow = animal as ICow,但这不是不必要地复制我的变量吗?我提供的示例过于简化,因为我实际上要解决的问题有十个派生类,并且该函数称为ton,因此我想使其尽可能高效。

2 个答案:

答案 0 :(得分:3)

您可以使用已区分的联合来完成此任务。您只需要向联合的每个memebr添加一个type成员,并将其实际类型作为字符串文字类型:

interface IAnimal {
  type: string;
  legs: number;
}

interface IChicken extends IAnimal {
  type: "chicken";
  eggsPerDay: number;
}

interface ICow extends IAnimal {
  type: "cow";
  milkProduction: number;
}

function doSomethingWithAnimal(animal: IChicken | ICow): void {
  switch (animal.type) {
    case 'cow':
      alert(`the milk production is ${animal.milkProduction}`); // ok now
  }
}

答案 1 :(得分:0)

您可以在下面尝试

  doSomethingWithAnimal(animal: IChicken | ICow): void {
    if(animal.hasOwnProperty('eggsPerDay')) {
      console.log('eggsPerDay', animal.eggsPerDay)
    } else if (animal.hasOwnProperty('milkProduction')) {
      console.log('milkProduction', animal.milkProduction)
    }; // other conditions
  }

StackBlitz代码供参考