Javascript 创建扩展基类的所有类的实例
我有一个名为Javascript 创建扩展基类的所有类的实例,javascript,typescript,Javascript,Typescript,我有一个名为Editor的基类,然后我有一些将扩展该类的项。我是否可以创建扩展Editor的所有类的实例,而不必手动创建它们 class Editor<T> { } class TransformEditor extends Editor<Transform> { } class SomethingEditor extends Editor<Something> { } 类编辑器{ } 类TransformEditor扩展了TransformEdi
Editor
的基类,然后我有一些将扩展该类的项。我是否可以创建扩展Editor
的所有类的实例,而不必手动创建它们
class Editor<T> {
}
class TransformEditor extends Editor<Transform> {
}
class SomethingEditor extends Editor<Something> {
}
类编辑器{
}
类TransformEditor扩展了TransformEditor{
}
类SomethingEditor扩展编辑器{
}
因此,在本例中,代码不知道TransformEditor是否存在,但它在代码库中,因此是否可以执行一些操作,从中获取这些项的列表,然后创建每个项的实例?您可以将所有这些类包装在命名空间中,然后可以迭代所有导出的项。
然后,您可以检查每个导出项是否是
编辑器的实例
大概是这样的:
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()]
命名空间编辑器{
导出函数getEditorClasses():EditorConstructor)因此,在运行时,如果不添加其他代码,就无法使用TypeScript实现这一点,因为JavaScript无法实现这一点
你可以用它来追踪孩子们。下面是一个非常简单的例子:
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);
这个装潢师当然会变得更加复杂。下面是一个非常详细的例子