TypeScript中如何基于字符串类名动态创建对应类的实例
实现方案
你可以通过构造函数映射表的方式实现,无需硬编码条件判断,同时兼顾类型安全和生产环境兼容性:
核心实现逻辑
提前维护一份字符串标识到对应服务类构造函数的映射表,Factory的create方法直接从映射表中取出构造函数实例化即可,后续新增服务只需要更新映射表,无需修改Factory逻辑,符合开闭原则。
完整可运行代码
interface IService {} class ServiceA implements IService {} class ServiceB implements IService {} // 定义服务构造函数类型 type ServiceConstructor = new () => IService; // 维护服务标识到构造函数的映射表 const ServiceRegistry: Record<string, ServiceConstructor> = { 'ServiceA': ServiceA, 'ServiceB': ServiceB }; interface IFactory { create(productType: string): IService; } class Factory implements IFactory { create(productType: string): IService { const Constructor = ServiceRegistry[productType]; if (!Constructor) { throw new Error(`未找到类型为${productType}的服务`); } return new Constructor(); } } class Caller { constructor(private factory: IFactory) {} getInstance(productType: string) { const instance = this.factory.create(productType); console.log(instance); return instance; } } // 测试 const caller = new Caller(new Factory()); caller.getInstance('ServiceA'); // 输出 ServiceA 实例 caller.getInstance('ServiceB'); // 输出 ServiceB 实例
注意事项
不要直接使用类的name属性(比如ServiceA.name)作为映射键,生产环境打包压缩时类名会被替换为短字符,会导致匹配失败,手动指定固定的字符串标识更稳妥。
如果需要更自动化的注册方式,可以配合TS装饰器实现,在定义服务类时自动注册到映射表中,无需手动维护映射表。
内容的提问来源于stack exchange,提问作者sharmav1
相关产品推荐
相关产品推荐

