物理路径即抽象契约
彻底消除数千行纵横交错的相对路径 import 声明。以物理目录结构自动映射逻辑契约,从数学拓扑层面杜绝隐式循环依赖与死锁。
向经典 Spring 致敬的 TypeScript 原生控制反转架构。告别繁琐装饰器与元数据包袱,以纯函数闭包与物理路径契约,实现微秒级极速冷启动的现代拓扑依赖查找引擎。
真实工业场景:模块 A (remoteConfig) 启动时需基于秘钥异步发起网络请求拉取配置数据包,对外暴露纯同步函数 isEnabled(feature);模块 B (orderService) 在自身初始化装配期,必须同步调用模块 A 的函数决定是否启用特性(模块 B 强物理依赖模块 A 的初始化先决条件)。
// Spring: 依托 JVM 物理多线程模型,在启动阶段阻塞主线程等待异步数据包拉取就绪
@Configuration
public class AppConfig {
@Bean
public RemoteConfig remoteConfig() {
RemoteConfig config = new RemoteConfig();
config.initFromRemote(secretKey); // 启动阶段阻塞线程等待远程配置完成
return config;
}
@Bean
public OrderService orderService(RemoteConfig remoteConfig) {
// 模块 B 在初始化装配期同步调用模块 A 的函数
boolean enableDiscount = remoteConfig.isEnabled("vip_discount");
return new OrderService(enableDiscount);
}
}// 痛点:TS Class 构造器无法 await!若用 onModuleInit 会因时序竞态读取到未初始化空值;
// 苦心经营的 @Injectable() 类体系在此刻土崩瓦解,被迫退化为冗长脆弱的 useFactory 字典:
@Module({
providers: [
{
provide: 'REMOTE_CONFIG',
useFactory: async () => {
const config = await fetchRemoteConfig(process.env.SECRET_KEY);
return { isEnabled: (feature: string) => config[feature] ?? false };
}
},
{
provide: 'ORDER_SERVICE',
useFactory: (config: RemoteConfig) => {
// 模块 B 必须手写工厂胶水代码,并手动在 inject 数组中维持脆弱的字符串映射
const enableDiscount = config.isEnabled('vip_discount');
return new OrderService(enableDiscount);
},
inject: ['REMOTE_CONFIG']
}
]
})
export class AppModule {}// 模块 A (src/modules/remoteConfig/index.ts):原生 async 函数初始化,返回纯同步闭包方法
export const main = async () => {
const config = await fetchRemoteConfig(process.env.SECRET_KEY);
return {
isEnabled(feature: string) { return config[feature] ?? false; } // 内部数据已就绪,纯同步!
};
};
// 模块 B (src/modules/orderService/index.ts):声明依赖短名称,装配期直接同步消费
export const dependencies = ["remoteConfig"];
export const main = (container: ModularContainer) => {
const { remoteConfig } = container;
// 拓扑引擎自动保证:唤醒 orderService 时,remoteConfig 的 async 初始化必定已 100% 解决!
const enableDiscount = remoteConfig.isEnabled("vip_discount");
return {
createOrder(item: string) {
return { item, price: enableDiscount ? 80 : 100 };
}
};
};