簡體   English   中英

創建擴展基類的所有類的實例

[英]Create instance of all classes that extend a base class

我有一個名為Editor的基類,然后我有一些擴展該類的項目。 我是否可以創建擴展Editor的所有類的實例而無需手動創建它們?

class Editor<T> {

}

class TransformEditor extends Editor<Transform> {

}

class SomethingEditor extends Editor<Something> {

}

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

您可以將所有這些類包裝在命名空間中,然后可以迭代所有導出的項目。
然后,如果它是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()]

游樂場代碼

所以沒有辦法在運行時使用TypeScript而不添加額外的代碼,因為沒有辦法用JavaScript做到這一點。

您可以使用TypeScript的裝飾器來跟蹤孩子。 這是一個非常簡單的例子:

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);

這個裝飾者當然可以變得更加復雜。 這是一個用裝飾器跟蹤完整家譜的非常詳細的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM