创建扩展基类的所有类的实例

时间:2016-08-12 18:54:07

标签: javascript typescript

我有一个名为Editor的基类,然后我有了扩展该类的项目。我是否可以创建扩展Editor的所有类的实例,而无需手动创建它们?

class Editor<T> {

}

class TransformEditor extends Editor<Transform> {

}

class SomethingEditor extends Editor<Something> {

}

所以,在这个例子中,代码并不知道TransformEditor出口,但它在代码库中,所以我可以做一些事情,我可以获得这些项目的列表,然后创建一个每个实例?

2 个答案:

答案 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()]

code in playground

答案 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

的一个非常详细的例子