所以这是我的问题,假设我有一些动物:
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,因此我想使其尽可能高效。
答案 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代码供参考