当前位置: 首页 > 知识库问答 >
问题:

TypeScript-检查类是否实现接口

蒋航
2023-03-14

我在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();
    }
}

现在,问题是我会添加更多的“行走”动物,这样移动动物的功能就会变得太大而无法控制。我想做的事情是这样的:

private moveAnimal(animal: Animal) {
    if (animal implements IWalkingAnimal ) {
        animal.walk();
    }
}

但是,“implements”检查不起作用,在使用接口时,我找不到与“instanceof”等效的。在Java中,“instanceof”的使用似乎可以在这里使用,但TypeScript不允许这样做。

TypeScript中存在这样的东西吗,或者这里有更好的方法吗?我使用的是TypeScript 1.8。9

共有1个答案

强阳曜
2023-03-14

与类不同,接口只在编译时存在,它们不包含在生成的JavaScript中,因此不能执行instanceof检查。

您可以将IWalkingAnimal作为动物的一个子类(并使用instanceof),或者您可以检查所讨论的对象是否具有行走方法:

if (animal['walk']) {}

您可以将其包装在用户定义的类型保护中(以便编译器在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
    }
}

 类似资料:
  • 好了, 我有一个标记接口: 然后我有一个类实现这个接口: 现在假设我有一个持有类MePOJO的引用: 那么,我如何通过使用来确定类是否实现了?

  • 问题内容: 我在运行时加载JSON配置文件,并使用接口定义其预期结构: 由于可以使用自动填充等功能,因此可以方便地访问各种属性。 问题: 有没有一种方法可以使用此声明来检查我加载的文件的正确性? 即我没有意外的属性? 问题答案: 没有。 当前,类型仅在开发和编译期间使用。类型信息不会以任何方式转换为已编译的JavaScript代码。

  • 问题:有没有一种方法可以使用这个声明来检查我加载的文件的正确性?我没有意外的财产?

  • 问题内容: 所以我在Java中有这个课程: 在这个类中,我想知道T是否实现某些接口。 以下代码不起作用,但这是我要完成的工作的主意: 所以我想检查传递给Foo 的类是否具有其签名。 可能吗?怎么样? 问题答案: 奇怪的是,泛型也用于接口。1您将要使用: 这实际上是实现的要求, 而不是true / false check 。 为了进行真/假检查,请使用无限制的generics()并确保获得a,以便您

  • 问题内容: 我已经读过“ EffectiveGo”和其他类似的问答:golang接口符合性编译类型检查,但是我仍然无法正确理解如何使用此技术。 请参见示例: 如果实现了接口,是否有任何简单的方法(例如,不使用反射)检查值? 问题答案: 如果您不知道值的类型,则只需检查值是否实现了接口。如果类型已知,则该检查由编译器自动完成。 如果您仍然想进行检查,则可以使用您提供的第二种方法进行检查: 在编译时会

  • 有没有办法,我如何检测某个对象是否实现了某个接口?