【发布时间】:2016-08-17 00:37:56
【问题描述】:
我有一个正在扩展另一个接口的接口。现在我试图将超接口类型的变量放入需要子接口类型参数的函数中。这是不可能的,因为超接口类型变量缺少某些属性。
这有点难以解释,所以我创建了一个带有Animal 接口的示例,该接口由Horse 接口扩展:
interface Animal {
age:number;
//... 100 other things
}
interface Horse extends Animal {
speed:number;
}
现在我有一个带有一个私有函数 (rideHorse) 的模块,它只接受一个 Horse 作为参数。还有一个公共函数 (rideAnimal),接受所有 Animals,如下所示:
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,这样错误就会消失?
【问题讨论】:
-
我不明白,您在下面的 cmets 中写道,所有动物都可以被认为是可以骑乘的,因此它们都需要速度。那么为什么不在 IAnimal 中定义速度呢?
-
@Alex
Animal接口已经定义,无法更改,但我的问题不是这个。我只是想知道是否可以将超接口转换为子接口。
标签: javascript types casting typescript