2013-04-15 85 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添加儘可能少的代碼,例外是「擴展」關鍵字,它爲編譯後的輸出添加了一種新方法。