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
相关产品推荐
相关产品推荐

