在TypeScript中动态检测对象是否实现了接口

25

有没有办法可以检测某个对象是否实现了某个接口?

if(myObj implements IMyInterface) {
    //... do something
}

是的,但你可以使用类代替接口。请参见示例。 - Alexey Baranoshnikov
请参考以下问题:https://dev59.com/KlsX5IYBdhLWcg3wcPOw - Rich
3个回答

17

不。

目前,类型仅在开发和编译时使用。类型信息不以任何方式翻译为编译后的JavaScript代码。

通过编译器的一些代码生成,这将是可能的。目前,TypeScript团队试图尽可能地向最终的JavaScript添加尽可能少的代码,例外情况是“extends”关键字,该关键字将向编译输出中添加一个新方法。


10

是的,如果你使用reflec-ts编译器而不是标准的tsc编译器。这个增强版本的TypeScript编译器可以让你知道每个应用程序类实现哪个接口。该编译器版本将所有类型信息存储到运行时,并将这些信息链接到实际构造函数。例如,你可以写出如下内容:

function implementsInterface(object: Object, target: Interface) {
    const objClass: Class = object.constructor && object.constructor.getClass();
    if (objClass && objClass.implements) { 
        let found = false;
        for (let base of objClass.implements) {
            let found = interfaceExtends(base, target);
            if (found) {
                return true;
            }
        }
    }
    return false;
}

// recursive interface inheritance check
function interfaceExtends(i: Interface, target: Interface) {
    if (i === target) { 
        return true;
    }
    if (i.extends) {
        let found = false;
        for (let base of i.extends) {
            // do a recursive check on base interface...
            found = interfaceExtends(base, target);
            if (found) {
                return true;
            }
        }
    }
    return false;
}

您可以在这里找到一个适合您需求的完整工作示例。


是的。如果您要测试的对象不是类的实例,则可以逐个字段进行检查。您传递给该方法的接口元对象将告诉您所有细节(可选字段等),您可以将这些与您的对象进行比较。这种检查速度较慢,但它可以工作。请参见示例作为起点。 - pcan
是的,它可以与空接口一起使用。Reflec-ts编译器会为您在代码中编写的每个“interface”声明创建一个合成常量。 - pcan

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接