gpt4 book ai didi

typescript -创建一个对象,通过其名称动态选择类

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:11 26 4
gpt4 key购买 nike

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

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

现在问题:

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

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

3) 如果这可以在浏览器环境中完成,旧版本的浏览器(比方说 IE9 及更高版本)是否也支持它?

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

提前致谢

最佳答案

你可以有这样的东西:

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 对象)。

关于 typescript -创建一个对象,通过其名称动态选择类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36977568/

26 4 0
文章推荐: Javascript Array Push 中断循环?
文章推荐: java - 列表与列表