動的インポートを使用して Typescript でファクトリ パターンを実装しているため、実行時に要求されたモジュールのロードを初期化し、(必要な構成で) 初期化できます。
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.htmlのように、モジュールをオンデマンドで動的にロードできます
ただし、ロードされたモジュールを初期化することはできません。開発者コンソールでは、初期化を行うことができますが、モジュールで構成されたサブモジュールとクラスを初期化することで、シームレスに構成することもできます。
この解決策を見つけるのに苦労し、多くのことを試しましたが、解決しませんでした。C# では、リフレクションを使用してそれを実行し、ライブラリとクラスのインスタンスを直接参照せずに遅延読み込みとして作成できます。
私がやっているとき、私が得ているエラーは "// タイプが呼び出しまたは構成の署名を欠いている式で 'new' を使用できません.ts(2351)" です。
let y: Interfaces.IComponent = new comp();
それを構築し、そのオブジェクトが実装しているインターフェースのタイプで varebale に割り当てます。
コンポーネントが拡張している親クラスの型についても同じ
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);
}
});
}
}