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

TypeScript中如何通过泛型类型参数初始化对应类的实例

解决方案

首先明确核心限制:TypeScript 泛型属于编译期类型语法,运行时会被完全擦除,因此无法直接通过泛型参数 TTypeA/TTypeB 直接创建实例,必须将对应的类构造函数作为运行时参数传入。

具体实现逻辑如下:

  1. 定义构造函数类型约束:声明可接收data参数、返回对应类型实例的构造器类型
  2. 改造BaseService构造函数,新增两个构造器入参,用于在运行时创建实例
  3. 子类继承BaseService时,在super调用中传入对应类的构造函数即可

完整可运行代码

export class MyClassA {
  // 可根据需要给data添加具体类型,此处用any做兼容
  constructor(data: any) {}
}

export class MyClassB {
  constructor(data: any) {}
}

// 泛型TTypeA、TTypeB为实例类型
export class BaseService<TTypeA, TTypeB> {
  typeA: TTypeA;
  typeB: TTypeB;

  // 构造函数新增两个构造器参数:
  // typeACtor: 接收data参数,返回TTypeA实例的构造函数
  // typeBCtor: 接收data参数,返回TTypeB实例的构造函数
  constructor(
    typeACtor: new (data: any) => TTypeA,
    typeBCtor: new (data: any) => TTypeB,
    data: any
  ) {
    this.typeA = new typeACtor(data);
    this.typeB = new typeBCtor(data);
  }
}

export class DataService extends BaseService<MyClassA, MyClassB> {
  constructor(data: any) {
    // 调用父类构造时传入对应类的构造函数即可
    super(MyClassA, MyClassB, data);
  }

  doSomething() {
    // 此处this.typeA会自动推导为MyClassA类型,有完整类型提示
    console.log(this.typeA);
    console.log(this.typeB);
  }
}

const data: any = {};
const service = new DataService(data);
service.doSomething();

扩展说明

如果你的构造函数参数格式固定,可以把构造器类型抽成公共类型简化代码:

// 通用构造器类型,支持任意参数
type Constructor<T> = new (...args: any[]) => T;
// 限定参数必须为单个data的版本
type DataConstructor<T> = new (data: any) => T;

如果需要支持多个不同参数的构造函数,只需要调整Constructor类型的参数约束即可。

内容的提问来源于stack exchange,提问作者Raptor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:01