问题描述
我正在使用动态导入在Typescript中实现工厂模式,以便可以在运行时初始化负载,初始化(具有必要的组成)所需模块。
我能够按需动态加载模块,如
但是,这不允许我初始化已加载的模块。 尽管在开发人员控制台中,我可以通过初始化其子模块和模块中组成的类来进行初始化,甚至可以无缝地进行初始化。
努力寻找这种解决方案并尝试了许多方法,但并未解决。 在C#中,我们可以使用反射来做到这一点,并且可以将库和类的实例创建为延迟加载,而无需直接引用它们。
我正在执行的错误是“ //无法在其类型缺少调用或构造签名的表达式中使用'new'。ts(2351)”
let y: Interfaces.IComponent = new comp();
构造它,并将其分配给该对象正在实现的接口类型的varebale。
组件正在扩展的父类类型相同
let x: ComponentImpl = new comp();
请看下面的打字稿代码。
import { Interfaces } from 'shared';
import { ComponentImpl } from 'core';
export default class Factory {
private _loadedModules: Map<string, Interfaces.IComponent> = new Map<string, Interfaces.IComponent>();
private static _instace: Factory;
private constructor() {
}
public static get Instance(): Factory {
return this._instace || (this._instace = new this());
}
public getComponent(component: string): Promise<Interfaces.IComponent> {
return new Promise<Interfaces.IComponent>(async (resolve, reject) => {
let comp = this._loadedModules.get(component);
if (comp !== null) {
comp = await import(`./${component}`);
if (comp) {
// ----------------------------------------------------------------------------
// ** NOTE: On run time I can see the module is loaded corrctly and I can initialze its sub classes in developer console.
// like controller = new comp.controller(); (get console log from constructor)
// controller.sayHello();
// controller.setAPIInstance(new comp.getAPI());
// controller.saveToAPI();
let y: Interfaces.IComponent = new comp(); // Cannot use 'new' with an expression whose type lacks a call or construct signature.ts(2351)
let x: ComponentImpl = new comp(); // Cannot use 'new' with an expression whose type lacks a call or construct signature.ts(2351)
this._loadedModules.set(component, comp);
resolve(comp);
} else {
reject("Unable lo load module");
}
} else {
setTimeout(() => {
resolve(comp);
}, 1);
}
});
}
}
1楼
Dominic Bütow
0
2019-03-14 07:05:33
您可以尝试以下适用于我的情况的解决方案:
let x: ComponentImpl = new (comp as typeof ComponentImpl )()
另请参阅来自TypeScript的此票证: :