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

如何在泛型函数中调用类型参数的静态方法?

解决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方法

关键说明

  1. 泛型约束调整:新增ComparableClass接口,确保传入的类构造函数包含符合要求的compare静态方法。
  2. 传递构造函数:sort函数新增cls参数,接收对应子类的构造函数(如Y或Z),通过构造函数访问静态compare方法。
  3. 类型安全保障:TypeScript会自动推断T的类型,确保compare方法的参数类型与传入的数组元素类型匹配,避免类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:05:21