如何使用工厂模式创建带有构造函数的代码拆分打字稿模块
How to create a code split typescript module with a constructor using the factory pattern
我有很多适配器都是从这样的接口实现的
export interface IAdapter {
doSomething(): void;
}
和实现的 类 看起来与您所期望的非常相似和基本
export default class AdapterA implements IAdapter {
private _property: string;
constructor(someProperty: string) {
this._property = someProperty;
}
}
我有一个适配器工厂,想像这样使用它
export abstract class AdapterFactory {
static async getInstance(name: string) Promise<IAdapter> {
switch(name) {
case 'a':
return import('./adapters/adapter-a');
case 'b':
return import('./adapters/adapter-b');
}
}
}
在调用工厂的代码之后,我希望能够使用返回的模块来实例化适配器的新实例,例如
const adapterModule = await getInstance('a');
const myNewAdapter = new adapterModule('prop');
myNewAdapter.doSomething();
当我在工厂里尝试这个时,我得到:
Type 'typeof import("/[absolute path]/adapters/AdapterA")' provides no match for the signature 'new (someProperty: string): IAdapter'
所以我尝试像这样添加 new 的定义(我不喜欢):
export interface IAdapter {
new(someProperty: string): IAdapter;
doSomething(): void;
}
现在我得到:
This expression is not constructable.
任何人都可以提供的任何帮助都会受到极大的欢迎
导入的构造函数should be extracted 来自default
:
const { default: adapterModule } = await getInstance('a');
The reason we need default is that since webpack 4, when importing a CommonJS module, the import will no longer resolve to the value of module.exports, it will instead create an artificial namespace object for the CommonJS module.
不相关的小建议:
- 重命名
getInstance
-> getConstructor
- 将 return 类型更改为
Promise<IAdapterConstructor>
其中 IAdapterConstructor
是:
interface IAdapterConstructor {
new(someProperty: string): IAdapter;
}
我有很多适配器都是从这样的接口实现的
export interface IAdapter {
doSomething(): void;
}
和实现的 类 看起来与您所期望的非常相似和基本
export default class AdapterA implements IAdapter {
private _property: string;
constructor(someProperty: string) {
this._property = someProperty;
}
}
我有一个适配器工厂,想像这样使用它
export abstract class AdapterFactory {
static async getInstance(name: string) Promise<IAdapter> {
switch(name) {
case 'a':
return import('./adapters/adapter-a');
case 'b':
return import('./adapters/adapter-b');
}
}
}
在调用工厂的代码之后,我希望能够使用返回的模块来实例化适配器的新实例,例如
const adapterModule = await getInstance('a');
const myNewAdapter = new adapterModule('prop');
myNewAdapter.doSomething();
当我在工厂里尝试这个时,我得到:
Type 'typeof import("/[absolute path]/adapters/AdapterA")' provides no match for the signature 'new (someProperty: string): IAdapter'
所以我尝试像这样添加 new 的定义(我不喜欢):
export interface IAdapter {
new(someProperty: string): IAdapter;
doSomething(): void;
}
现在我得到:
This expression is not constructable.
任何人都可以提供的任何帮助都会受到极大的欢迎
导入的构造函数should be extracted 来自default
:
const { default: adapterModule } = await getInstance('a');
The reason we need default is that since webpack 4, when importing a CommonJS module, the import will no longer resolve to the value of module.exports, it will instead create an artificial namespace object for the CommonJS module.
不相关的小建议:
- 重命名
getInstance
->getConstructor
- 将 return 类型更改为
Promise<IAdapterConstructor>
其中 IAdapterConstructor
是:
interface IAdapterConstructor {
new(someProperty: string): IAdapter;
}