如何在泛型函数中调用类型参数的静态方法?
解决TypeScript泛型函数调用子类静态compare方法的问题
原代码中泛型sort函数无法直接通过类型参数T访问静态compare方法,因为T代表的是实例类型而非类本身的类型。要实现根据传入类型调用对应静态方法的需求,需要调整泛型约束并传递类的构造函数,具体修改如下:
修改后的代码
abstract class X {} class Y extends X { id: number = 0; static compare(a: Y, b: Y) { return a.id - b.id; } } class Z extends X { name: string = ""; static compare(a: Z, b: Z) { return a.name.localeCompare(b.name); // 修正原代码拼写错误 } } // 定义接口约束带有静态compare方法的类 interface ComparableClass<T extends X> { compare(a: T, b: T): number; } // 修改泛型sort函数,接收类构造函数作为参数 function sort<T extends X>(cls: ComparableClass<T>, items: T[]) { return items.sort((a, b) => cls.compare(a, b)); } // 调用方式 sort(Y, [new Y(), new Y()]); // 使用Y的compare方法 sort(Z, [new Z(), new Z()]); // 使用Z的compare方法
关键说明
- 泛型约束调整:新增
ComparableClass接口,确保传入的类构造函数包含符合要求的compare静态方法。 - 传递构造函数:
sort函数新增cls参数,接收对应子类的构造函数(如Y或Z),通过构造函数访问静态compare方法。 - 类型安全保障:TypeScript会自动推断
T的类型,确保compare方法的参数类型与传入的数组元素类型匹配,避免类型错误。
内容的提问来源于stack exchange,提问作者leonheess
相关产品推荐
相关产品推荐

