我有一个扩展另一个接口。现在我正试图将超级接口类型的变量放入需要子接口类型参数的函数中。这是不可能的,因为超级界面类型的变量缺少某些属性。TypeScript接口向下转换
这是一个有点难以解释,所以我创建了一个Animal
接口,它是由Horse
接口扩展的例子:
interface Animal {
age:number;
//... 100 other things
}
interface Horse extends Animal {
speed:number;
}
现在我有一个私人的功能模块(rideHorse
) ,它只接受Horse
作为参数。和公共功能(rideAnimal
),接受所有Animal
就像如下:
module AnimalModule {
function rideHorse(horse:Horse) {
alert(horse.speed);
}
export function rideAnimal(animal:Animal) {
animal.speed = 10; // Error: Animal cannot have speed
rideHorse(animal); // Error: 'animal' needs speed
}
}
// Calling the rideAnimal function
var myAnimal:Animal = {
age: 10
};
AnimalModule.rideAnimal(myAnimal);
正如你可以看到这是行不通的,因为rideAnimal
的animal
参数没有speed
。所以我的问题是:如何将animal
投入Horse
并在rideAnimal
函数内手动添加speed
,这样错误就会消失?
我不明白,下面的评论中写道,所有的动物都可以被认为是可骑乘的,因此他们都需要加速。那么你为什么不直接在IAnimal中定义速度? – Alex
@Alex'Animal'界面已经定义好了,不能改变,但我的问题不在于此。我只想知道是否可以将超级接口投射到子接口。 –
好吧,我想我会为你解答正确的答案... – Alex