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

我正在使用TypeScript中的接口来定义一个函数,该函数仅在扩展基类的某些类上可用。这是我迄今为止所用代码的简化版本:

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
    }
}