Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建扩展基类的所有类的实例_Javascript_Typescript - Fatal编程技术网

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);
这个装潢师当然会变得更加复杂。下面是一个非常详细的例子