【发布时间】:2018-11-05 03:10:05
【问题描述】:
我在一个 NodeJS Typescript 项目中定义了一个抽象 BaseClass,并且我有一个实现和扩展这个 BaseClass 的派生类列表。
// baseModule.ts
export abstract class BaseClass {
constructor() {}
abstract method(): void;
}
export interface ModuleConstructor<T extends BaseClass> {
new (): T
}
export function createModule<T extends BaseClass>(type: ModuleConstructor<T>): T {
return new type();
}
我正在尝试找到一种在运行时以编程方式创建这些类之一的实例的方法。
这里的限制是我希望能够将一个新的myDerivedClass.ts 文件放到我的项目文件夹中,并让它在运行时自动包含在可用模块列表中。
开发人员的工作流程是 1) 创建新文件 myNewModule.ts 2) 创建并导出一个扩展 BaseClass 的类 3) 将 myNewModule.ts 保存到 ./myModules
// ./myModules/myNewModule.ts
export class MyModule extends BaseClass {
constructor() {
super()
}
method() {
//Do something custom
}
}
运行时流程(理想情况下无需重新构建)将是 1) 用户从可用模块列表中选择 2) createModule 工厂函数创建所选模块的新实例并作为
// someOtherClass.ts
const modules = require('./myModules/*') //<- Something to this effect
import { BaseClass, createModule, ModuleConstructor } from './BaseClass'
export class SomeOtherClass {
public mod: BaseClass
constructor(mod: ModuleConstructor) {
this.mod = createModule(mod)
}
}
for (let m in modules) {
console.log(modules[m].name);
}
let someObj = SomeOtherClass(modules[m]);
someObj.mod // <- instance of derived class.
【问题讨论】:
标签: node.js typescript es6-modules dynamic-loading