You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 16:36:03