Typescript - 创建一个通过名称动态选择类的对象

时间:2016-05-02 07:52:59

标签: typescript

我有一个Typescrip应用程序,我需要实现代表不同控制逻辑的不同类(例如ControlLogicAControlLogicBControlLogicC)。所有这些类都是同一个抽象超类(ControlLogicAbstract)的扩展。

要应用的控制逻辑在配置时确定,因此,在运行时,我唯一知道的是我需要以字符串形式使用的类的名称(例如controlLogicClassName)。

现在问题:

1)在Typescript中是否可以创建一个仅从类名开始的类的实例(例如只知道controlLogicClassName)?

2)是否可以在浏览器环境和Node环境中执行此操作?

3)如果这可以在浏览器环境中完成,那么老版本的浏览器是否也支持(比如说IE9及以上版本)?

附加问题:是否可以查询(在运行时)抽象的Typescript类(例如ControlLogicAbstract)以获取其所有可用子类的列表(在我的示例中为ControlLogicA,ControlLogicB和ControlLogicC)?

提前致谢

1 个答案:

答案 0 :(得分:4)

您可以拥有以下内容:

interface ControlLogicConstrctor {
    new (): ControlLogicAbstract;
}

abstract class ControlLogicAbstract {}

class ControlLogic1 extends ControlLogicAbstract {}

class ControlLogic2 extends ControlLogicAbstract {}

var ctors: { [name: string]: ControlLogicConstrctor } = {
    "control1": ControlLogic1,
    "control2": ControlLogic2,
    // ...
    "controlN": ControlLogicN
}

function factory(name: string): ControlLogicAbstract {
    let ctor = ctors[name];

    if (!ctor) {
        return null;
    }

    return new ctor();
}

这在浏览器和节点中应该可以正常工作 基本上在javascript中这些类只是函数,例如:

class MyClass {
    private x: number;

    constructor() {
        this.x = 4;
    }
}

编译成:

var MyClass = (function () {
    function MyClass() {
        this.x = 4;
    }
    return MyClass;
}());

所以你最终只能将MyClass作为一个函数。

不,你没有办法获得所有扩展课程 在ts / js中不支持这一点,你需要以某种方式自己处理(比如有一个包含类/ ctors的数据结构,有点像我的ctors对象)。