我在Typescript中使用一个接口来定义一个仅在扩展基类的某些类上可用的函数。这是我到目前为止的代码的简化版本:
private moveAnimal(animal: Animal) {
if (animal implements IWalkingAnimal ) {
animal.walk();
}
}
现在,问题是我将添加更多“行走”动物,因此moveAnimal功能将变得太大而无法管理。我想做的是这样的事情:
Flexbox
然而,'implements'检查不起作用,我在使用接口时找不到'instanceof'的等价物。在Java中,似乎使用'instanceof'可以在这里工作,但TypeScript不允许这样做。
TypeScript中是否存在这样的东西,或者这里有更好的方法吗?我使用的是TypeScript 1.8.9。
答案 0 :(得分:26)
与类不同,接口仅在编译时存在,它们不包含在生成的Javascript中,因此您无法进行instanceof
检查。
您可以将IWalkingAnimal
设为Animal的子类(并使用instanceof
),或者您可以检查相关对象是否有walk
方法:
if (animal['walk']) {}
您可以将其包装在user defined type guard中(这样编译器可以在if
语句中使用时缩小类型,就像使用instanceof
一样)。
/**
* User Defined Type Guard!
*/
function canWalk(arg: Animal): arg is IWalkingAnimal {
return (arg as IWalkingAnimal).walk !== undefined;
}
private moveAnimal(animal: Animal) {
if (canWalk(animal)) {
animal.walk(); // compiler knows it can walk now
}
}