Javascript TypeScript:使用动态导入的工厂模式不允许为合成构建对象的新实例
我使用动态导入在Typescript中实现工厂模式,这样我就可以在运行时初始化所需模块的加载和初始化(具有必要的组合) 我能够根据需要动态加载模块 但是,它不允许我初始化加载的模块。 虽然在开发人员控制台中,我可以通过初始化其子模块和模块中组成的类来进行初始化,甚至无缝地组合它 为了找到这个解决方案,他做了很多尝试,但都没有解决。在C#中,我们可以使用反射来实现,并创建库和类的实例作为延迟加载,而无需直接引用它们 我得到的错误是“/”在执行此操作时,无法将“new”与类型缺少调用或构造签名的表达式一起使用。ts(2351)”Javascript TypeScript:使用动态导入的工厂模式不允许为合成构建对象的新实例,javascript,webpack,factory-pattern,ts-loader,dynamic-import,Javascript,Webpack,Factory Pattern,Ts Loader,Dynamic Import,我使用动态导入在Typescript中实现工厂模式,这样我就可以在运行时初始化所需模块的加载和初始化(具有必要的组合) 我能够根据需要动态加载模块 但是,它不允许我初始化加载的模块。 虽然在开发人员控制台中,我可以通过初始化其子模块和模块中组成的类来进行初始化,甚至无缝地组合它 为了找到这个解决方案,他做了很多尝试,但都没有解决。在C#中,我们可以使用反射来实现,并创建库和类的实例作为延迟加载,而无需直接引用它们 我得到的错误是“/”在执行此操作时,无法将“new”与类型缺少调用或构造签名的表达
let y: Interfaces.IComponent = new comp();
构造该对象并将其分配给该对象正在实现的接口类型的varebable
与组件正在扩展的父类类型相同
let x: ComponentImpl = new comp();
请看下面的typescript代码
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);
}
});
}
}
从“共享”导入{Interfaces};
从“核心”导入{ComponentMPL};
导出默认类工厂{
private_loadedModules:Map=newmap();
私人静电装置:工厂;
私有构造函数(){
}
公共静态get实例():工厂{
返回此;
}
公共getComponent(组件:字符串):承诺{
返回新承诺(异步(解析、拒绝)=>{
让comp=this.\u loadedModules.get(组件);
if(comp!==null){
comp=等待导入(`./${component}`);
如果(公司){
// ----------------------------------------------------------------------------
//**注意:在运行时,我可以看到模块已正确加载,并且可以在开发人员控制台中初始化其子类。
//like controller=new comp.controller();(从构造函数获取控制台日志)
//controller.sayHello();
//controller.setapinstance(新comp.getAPI());
//controller.saveToAPI();
设y:Interfaces.IComponent=new comp();//不能将“new”与类型缺少调用或构造签名的表达式一起使用。ts(2351)
设x:ComponentImpl=new comp();//不能将“new”与类型缺少调用或构造签名的表达式一起使用。ts(2351)
此.u加载的模块集(组件、组件);
解决(comp);
}否则{
拒绝(“无法加载模块”);
}
}否则{
设置超时(()=>{
解决(comp);
}, 1);
}
});
}
}
您可以尝试以下在我的案例中有效的解决方案:
let x: ComponentImpl = new (comp as typeof ComponentImpl )()
另请参见TypeScript中的这张票证:您可以尝试以下在我的案例中有效的解决方案:
let x: ComponentImpl = new (comp as typeof ComponentImpl )()
另请参见TypeScript中的这张罚单:Hey@Ishaan,你得到解决方案了吗?。面对同样的问题。任何建议!嘿@Ishaan,你找到解决办法了吗?。面对同样的问题。任何建议!