动态检测对象是否在类型记录中实现接口

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

有没有办法,我怎么能检测到对象实现一些接口?

if(myObj implements IMyInterface) {
    //... do something
}
提问于
用户回答回答于

可以使用类型记录编译器的增强型版本来实现这一点,该版本允许实现应用程序的每个类的接口。此版本的编译器将所有类型信息存储到运行时,并将这些信息链接到实际的构造函数。例如,编写如下内容:

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;
}
用户回答回答于

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

有了编译器生成的一些代码,这是可能的。目前,类型记录团队正试图向最终的JavaScript中添加尽可能少的代码,但“EXTEND”关键字是例外,该关键字为编译后的输出添加了一个新方法。

扫码关注云+社区