TypeScript:如何让静态create方法从调用类推断泛型类型?
解决方案
要实现子类调用create时自动推断返回类型,关键是利用TypeScript的静态方法this类型和InstanceType工具类型,无需手动传入泛型参数。
修改后的代码如下:
class Base { static create<T extends typeof Base>(this: T, data?: Partial<InstanceType<T>>): InstanceType<T> { const record = new (Object.getPrototypeOf(this))(); Object.assign(record, data); return record as InstanceType<T>; } } class Parent extends Base { name = ''; age?: number; } // 自动推断返回类型为Parent,无需手动传泛型 const record = Parent.create(); console.log(record.name); // 类型安全,不会报错 // 传入data时也会自动校验类型 const recordWithData = Parent.create({ name: 'Alice', age: 30 }); console.log(recordWithData.age); // 类型正确
关键说明
- 静态方法的this类型:静态方法中的
this指向调用该方法的类构造函数,通过this: T约束T为当前类的构造函数类型。 - InstanceType工具类型:
InstanceType<T>可以从类构造函数类型T中提取出实例类型,让返回值自动对应调用类的实例。 - Partial类型:给
data参数加上Partial<InstanceType<T>>,确保传入的data符合实例的属性结构,同时允许仅传入部分属性。
这样修改后,Base类及其子类调用create时,都能自动推断出正确的返回类型,完全不需要手动指定泛型参数,保持了调用方式的简洁性。
内容的提问来源于stack exchange,提问作者incutonez
相关产品推荐
相关产品推荐

