我有一个名为Editor
的基类,然后我有了扩展该类的项目。我是否可以创建扩展Editor
的所有类的实例,而无需手动创建它们?
class Editor<T> {
}
class TransformEditor extends Editor<Transform> {
}
class SomethingEditor extends Editor<Something> {
}
所以,在这个例子中,代码并不知道TransformEditor
出口,但它在代码库中,所以我可以做一些事情,我可以获得这些项目的列表,然后创建一个每个实例?
答案 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()]
答案 1 :(得分:2)
所以没有办法在运行时使用TypeScript而不添加额外的代码,因为没有办法用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
的一个非常详细的例子