![](/img/trans.png)
[英]Find all classes in a Javascript application that extend a base class
[英]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.