2016-08-12 71 views
3

我有一個名爲Editor的基類,然後我有擴展該類的項。是否有可能創建一個所有那些擴展Editor而不手動創建它們的類的實例?創建擴展基類的所有類的實例

class Editor<T> { 

} 

class TransformEditor extends Editor<Transform> { 

} 

class SomethingEditor extends Editor<Something> { 

} 

所以,在這個例子中,代碼不知道TransformEditor退出,但它是在代碼庫,所以是有可能做一些事情,我可以得到這些項目的列表,然後創建的實例每?

回答

2

所以沒有辦法做到這一點,在與打字稿運行時無需增加額外的代碼,因爲沒有辦法使用JavaScript來做到這一點。

您可以使用TypeScript's decorators來追蹤孩子。這裏有一個非常簡單的例子:當然

class Editor {} 

const children = []; // This could be an object that maps parents to children 

function TrackChild(constructor: Function) { 
    // You could also add more fancy prototype/constructor shenanigans here 
    children.push(constructor); 
} 

@TrackChild 
class TransformEditor extends Editor {} 

@TrackChild 
class SomethingEditor extends Editor {} 

console.log(children); 

這個裝飾可能變得更加複雜。這裏有一個非常詳細的例子tracking a full genealogy with decorators

+0

這只是完美的工作! –

3

您可以將所有這些類封裝在名稱空間中,然後您可以迭代所有導出的項目。
然後,您可以檢查每個導出的項目,如果它是Editor構造函數的實例。

事情是這樣的:

namespace editors { 
    export function getEditorClasses(): EditorConstructor<any>[] { 
     let list = []; 

     Object.keys(this).forEach(name => { 
      let obj = this[name]; 

      if (obj.prototype instanceof editors.Editor) { 
       list.push(obj); 
      } 
     }); 

     return list; 
    } 

    export interface EditorConstructor<T> { 
     new(): Editor<T>; 
    } 

    export class Editor<T> {} 

    export class TransformEditor extends Editor<string> {} 

    export class SomethingEditor extends Editor<boolean> {} 
} 

console.log(editors.getEditorClasses()); // [function TransformEditor(), function SomethingEditor()] 

code in playground