繁体   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