Javascript TypeScript:使用动态导入的工厂模式不允许为合成构建对象的新实例

Javascript TypeScript:使用动态导入的工厂模式不允许为合成构建对象的新实例,javascript,webpack,factory-pattern,ts-loader,dynamic-import,Javascript,Webpack,Factory Pattern,Ts Loader,Dynamic Import,我使用动态导入在Typescript中实现工厂模式,这样我就可以在运行时初始化所需模块的加载和初始化(具有必要的组合) 我能够根据需要动态加载模块 但是,它不允许我初始化加载的模块。 虽然在开发人员控制台中,我可以通过初始化其子模块和模块中组成的类来进行初始化,甚至无缝地组合它 为了找到这个解决方案,他做了很多尝试,但都没有解决。在C#中,我们可以使用反射来实现,并创建库和类的实例作为延迟加载,而无需直接引用它们 我得到的错误是“/”在执行此操作时,无法将“new”与类型缺少调用或构造签名的表达

我使用动态导入在Typescript中实现工厂模式,这样我就可以在运行时初始化所需模块的加载和初始化(具有必要的组合)

我能够根据需要动态加载模块

但是,它不允许我初始化加载的模块。 虽然在开发人员控制台中,我可以通过初始化其子模块和模块中组成的类来进行初始化,甚至无缝地组合它

为了找到这个解决方案,他做了很多尝试,但都没有解决。在C#中,我们可以使用反射来实现,并创建库和类的实例作为延迟加载,而无需直接引用它们

我得到的错误是“/”在执行此操作时,无法将“new”与类型缺少调用或构造签名的表达式一起使用。ts(2351)”

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,你找到解决办法了吗?。面对同样的问题。任何建议!