派生包装类静态方法的自动类型推断问题
TypeScript 基类静态构建器同时推断派生类与泛型类型问题
我希望在基类上定义的静态构建器方法,能自动推断出派生类类型和包装的泛型类型,但目前只能实现其中一种推断。以下是简化代码示例:
export class Collection<T> { constructor(private _xs: T[]) {} static fromArray1<C extends typeof Collection, T>(this: C, xs: T[]): InstanceType<C> { return new this(xs) as InstanceType<C>; } static fromArray2<C extends Collection<T>, T>(this: new (xs: T[]) => C, xs: T[]): C { return new this(xs); } } export class ExtendedCollection<T> extends Collection<T> {} // 期望自动推断为 ExtendedCollection<number> const ec1 = ExtendedCollection.fromArray1([1, 2, 3]); const ec2 = ExtendedCollection.fromArray2([1, 2, 3]);
解决方案:双向泛型推导优化
通过调整泛型参数的约束逻辑,让TypeScript同时完成派生类和泛型类型的自动推断,代码如下:
export class Collection<T> { constructor(private _xs: T[]) {} static fromArray<T, C extends Collection<T>>( this: new (xs: T[]) => C, xs: T[] ): C { return new this(xs); } } export class ExtendedCollection<T> extends Collection<T> {} // 自动推断为 ExtendedCollection<number> const ec = ExtendedCollection.fromArray([1, 2, 3]);
核心逻辑说明
- 泛型
T优先通过传入的数组xs推导(此处自动识别为number) - 泛型
C通过this的构造函数类型推导,同时约束C是Collection<T>的子类,保证类型兼容 - 这种写法让TypeScript完成双向推导,无需手动指定任何类型参数
如果需要适配带额外参数的派生类构造函数,可进一步扩展this的类型约束,当前写法已覆盖绝大多数基础场景。
内容的提问来源于stack exchange,提问作者tokland
相关产品推荐
相关产品推荐

