听起来意思是依赖注入,其他模块想用另一个模块都通过基座包去获取;我们项目大概是这么实现的:每个模块是一个文件夹,文件夹下只可引用基座包,里面调用基座包注入自身模块,这样剪切文件夹就实现了新增和移除模块
至于强类型支持就需要 ts 的类型体操了,可以写一个模块生成器实现在依赖注入,声明其注入的一定是某个类型
下面是我们项目的简单示例
模块生成器文件:
// 声明所有模块都是 TypeModules 类型
declare global {
interface TypeModules { }
}
class _coreModule {
static instance: _coreModule;
moduleMap: { [key: string]: any } = {};
static initInstance(): _coreModule {
return _coreModule.instance = new _coreModule();
}
setModule<T extends keyof TypeModules>(name: T, module: TypeModules[T]) {
this.moduleMap[name] = module;
}
getModule<T extends keyof TypeModules>(name: T): TypeModules[T] {
return this.moduleMap[name] as TypeModules[T];
}
}
export const coreModule = _coreModule.initInstance();
/**
* @
desc: 模块生成器
* @
param {T} name 模块名称
* @
param {new () => TypeModules[T]} moduleClass 模块类
* @
return {TypeModules[T]} 模块实例
*/
export function ModuleGenerate<T extends keyof TypeModules>(name: T, moduleClass: new () => TypeModules[T]): TypeModules[T] {
// eg:具体的实现; coreModule 保存注入依赖
const instance = new moduleClass();
coreModule.setModule(name, instance);
return instance;
}
测试文件:
declare global {
interface TypeModules {
/**
* @
desc: [模块] 测试模块
*/
testData: TestDataClass
}
}
export class TestDataClass {
// 具体实现
}
// 注入
const testData = ModuleGenerate('testData', TestDataClass);
其他 文件或模块中
// testData 类型就是 TestDataClass ,完全不需要引入 测试模块的文件,但当测试模块删除时,这段代码编译时会报错
let testData = coreModule.getModule('testData');