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

tyky79it  于 2023-04-13  发布在  TypeScript
关注(0)|答案(3)|浏览(139)

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

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

zrfyljdw1#

不知道
目前,类型仅在开发和编译时使用。类型信息不会以任何方式转换为编译的JavaScript代码。
通过编译器生成一些代码,这将是可能的。目前,TypeScript团队正在尝试向最终的JavaScript添加尽可能少的代码,例外是'extends'关键字,它向编译输出添加了一个新方法。

gblwokeq

gblwokeq2#

是的,如果你使用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;
}

您可以找到适合您需要的完整工作示例here

mspsb9vt

mspsb9vt3#

有几个选项可供选择:

  • 使用像ts-interface-checker这样的库,它可以在构建时从类型声明中生成验证代码。
  • 使用像reflect-ts这样的编译器扩展--参见@pcan的回答
  • 手动编写“类型保护”函数,请参见https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards

相关问题