我有一个Typescrip应用程序,我需要实现代表不同控制逻辑的不同类(例如ControlLogicA
,ControlLogicB
,ControlLogicC
)。所有这些类都是同一个抽象超类(ControlLogicAbstract
)的扩展。
要应用的控制逻辑在配置时确定,因此,在运行时,我唯一知道的是我需要以字符串形式使用的类的名称(例如controlLogicClassName
)。
现在问题:
1)在Typescript中是否可以创建一个仅从类名开始的类的实例(例如只知道controlLogicClassName
)?
2)是否可以在浏览器环境和Node环境中执行此操作?
3)如果这可以在浏览器环境中完成,那么老版本的浏览器是否也支持(比如说IE9及以上版本)?
附加问题:是否可以查询(在运行时)抽象的Typescript类(例如ControlLogicAbstract
)以获取其所有可用子类的列表(在我的示例中为ControlLogicA,ControlLogicB和ControlLogicC)?
提前致谢
答案 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
对象)。