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

TypeScript中如何正确定义支持泛型参数的内部类?

TypeScript泛型内部类实现方案

错误原因

原有写法在同名命名空间导出B类型时,没有声明泛型参数透传,导出的是固定非泛型类型,因此传入类型参数时会触发Type 'B' is not generic.(2315)报错。

正确实现代码

利用TS类与同名命名空间的声明合并特性,在命名空间中声明带泛型参数的类型别名,将泛型透传给内部类构造函数即可:

class A {
  // 定义静态泛型内部类表达式
  static B = class B<T> {
    value: T;
    constructor(value: T) {
      this.value = value;
    }
  }
}

// 同名命名空间合并类型声明
namespace A {
  // 导出泛型类型,透传参数到内部类构造函数,通过InstanceType拿到对应实例类型
  export type B<T> = InstanceType<typeof A.B<T>>;
}

使用验证

以下代码可正常通过类型检查,无TS2315报错:

class DemoClass<T> {
  // 可正常传入泛型参数声明属性
  protected buckets: Array<A.B<T>> = [];
}

// 实例化时可自动推导泛型类型
const strInstance = new A.B("hello"); // 类型为A.B<string>
const numInstance = new A.B(123); // 类型为A.B<number>

注意事项

  • 静态挂载的内部类无法访问外层类的实例级泛型参数,如果需要内外层共享泛型,可将内部类挂载为实例属性,通过this["B"]获取类型即可,无需额外命名空间声明。
  • 不要遗漏泛型参数的透传声明,否则导出的类型会丢失泛型签名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:03:23