2013-04-15 42 views

回答

4

。现在,您可以使用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

+0

它是否适用于对象文字? –

+0

是的。如果您必须测试的对象不是类的实例,则可以逐字段进行检查。你传递给方法的接口元对象会告诉你所有的细节(可选的字段等等),你可以检查那些对象。这种检查速度较慢,但​​会起作用。作为起点,请参阅[this](https://github.com/pcan/reflec-ts-examples/tree/master/simple-validator)示例。 – pcan

+0

它是否适用于空接口? –

14

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

随着编译器生成一些代码,这是可能的。目前,TypeScript团队正在尝试向最终JavaScript添加尽可能少的代码,例外是“扩展”关键字,它为编译后的输出添加了一种新方法。