有没有办法可以检测某个对象是否实现了某个接口?
if(myObj implements IMyInterface) {
//... do something
}
有没有办法可以检测某个对象是否实现了某个接口?
if(myObj implements IMyInterface) {
//... do something
}
不。
目前,类型仅在开发和编译时使用。类型信息不以任何方式翻译为编译后的JavaScript代码。
通过编译器的一些代码生成,这将是可能的。目前,TypeScript团队试图尽可能地向最终的JavaScript添加尽可能少的代码,例外情况是“extends”关键字,该关键字将向编译输出中添加一个新方法。
是的,如果你使用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;
}
您可以在这里找到一个适合您需求的完整工作示例。
有几个选项:
使用像ts-interface-checker这样的库,在构建时从您的类型声明生成验证代码。更多类似的库列在使用TypeScript检查对象是否实现了接口中
使用编译器扩展,例如reflec-ts -- 请参见@pcan的答案
手动编写“类型保护”函数,请参见https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards