2016-08-12 9 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

関連する問題