TypeScript-检查类是否实现了接口
我正在使用TypeScript中的接口来定义一个函数,该函数仅在扩展基类的某些类上可用。这是我迄今为止所用代码的简化版本:TypeScript-检查类是否实现了接口,typescript,Typescript,我正在使用TypeScript中的接口来定义一个函数,该函数仅在扩展基类的某些类上可用。这是我迄今为止所用代码的简化版本: class Animal { } interface IWalkingAnimal { walk(): void; } class Dog extends Animal implements IWalkingAnimal { } class Cat extends Animal implements IWalkingAnimal { } class Snak
class Animal {
}
interface IWalkingAnimal {
walk(): void;
}
class Dog extends Animal implements IWalkingAnimal {
}
class Cat extends Animal implements IWalkingAnimal {
}
class Snake extends Animal {
}
private moveAnimal(animal: Animal) {
if (animal instanceof Cat || animal instanceof Dog) {
animal.walk();
}
}
现在,问题是我将添加更多的“行走”动物,这样moveAnimal功能将变得太大而无法管理。我想做的是这样的:
private moveAnimal(animal: Animal) {
if (animal implements IWalkingAnimal ) {
animal.walk();
}
}
但是,“implements”检查不起作用,在使用接口时,我找不到与“instanceof”等效的。在Java中,“instanceof”的使用似乎可以在这里使用,但TypeScript不允许这样做
TypeScript中存在这样的东西吗,或者这里有更好的方法吗?我使用的是TypeScript 1.8.9。与类不同,接口仅在编译时存在,它们不包含在生成的JavaScript中,因此您无法执行
实例检查
您可以将IWalkingAnimal
作为动物的一个子类(并使用instanceof
),或者您可以检查所讨论的对象是否具有行走方法:
if (animal['walk']) {}
您可以将其包装成一个字符串(这样编译器在if
语句中使用时可以缩小类型,就像instanceof
一样)
你为什么不把IWalkingAnimal
作为动物的一个子类而不是一个接口呢?这样你就不会有问题了,而且会sense@iberbeu这将适用于这个简化的示例,为了灵活性,我希望IWalkingAnimal成为一个接口,这样它就不会严格地与动物绑定。Thilo在下面的回答应该可以做到这一点。可能重复我建议执行的(arg为IWalkingAnimal)。walk
,因此,如果您决定将walk方法重命名为其他方法,则类型保护中的代码也将更改。
/**
* 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
}
}