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

TypeScript中能否将类的typeof传入构造函数并匹配泛型类型?

解决TypeScript中BaseService模型构造函数的类型兼容问题

针对你遇到的问题,核心是要定义一个同时包含BaseModel静态方法、且构造函数返回指定子类实例的类型。以下是具体的解决方案:

正确的类型定义方式

先定义一个泛型构造器类型,它继承typeof BaseModel的静态成员,同时明确构造函数返回子类实例M:

type UnknownJson = Record<string, unknown>;

class BaseModel {
  constructor(json: UnknownJson) {
    // 你的实现逻辑
  }

  static toJson<T>(record: Partial<T>): UnknownJson {
    // 你的实现逻辑
    return {};
  }
}

class Car extends BaseModel {}

// 模型构造器类型:继承BaseModel静态方法 + 返回子类实例的构造函数
type ModelConstructor<M extends BaseModel> = typeof BaseModel & {
  new (json: UnknownJson): M;
};

class BaseService<M extends BaseModel> {
  constructor(private ModelClass: ModelConstructor<M>) {}

  fromJson(json: UnknownJson): M {
    return new this.ModelClass(json);
  }

  // 示例:调用BaseModel的静态方法
  convertToJson(record: Partial<M>): UnknownJson {
    return this.ModelClass.toJson(record);
  }
}

class CarService extends BaseService<Car> {
  constructor() {
    super(Car);
  }
}

为什么之前的写法不生效?

  • 若使用() => M:这是普通函数类型,不是构造函数(无法用new调用),同时完全丢失了BaseModel的静态方法定义,自然无法调用toJson。
  • 若使用typeof BaseModel & ((json: UnknownJson) => M):这里的((json: UnknownJson) => M)是普通函数签名,而非构造函数签名。typeof BaseModel本身已经包含构造函数new (json: UnknownJson) => BaseModel,类型合并时普通函数签名不会覆盖构造函数的返回类型,因此new this.ModelClass(json)仍会被识别为返回BaseModel而非M。

验证效果

现在你可以正常调用静态方法,同时fromJson会正确返回子类类型:

const carService = new CarService();
const car: Car = carService.fromJson({ brand: "Tesla" });
const carJson = carService.convertToJson({ brand: "Ford" }); // 正确调用静态方法toJson

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:27:26