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

TypeScript中如何获取类传入的泛型类型参数?

实现结论

该需求完全可以实现,你原来的写法里typeof myTest拿到的是整个MyTestClass<'hello' | 'goodbye'>实例类型,不是目标泛型参数本身,通过TypeScript自带的类型推断能力就能提取到类初始化时传入的泛型类型。

实现方案

方案1:直接提取类方法参数类型(最简便)

因为你的泛型T直接作为doSomething方法的第一个参数类型使用,直接用内置的Parameters工具类型就能拿到对应类型,不需要额外编写类型工具:

class MyTestClass<T> {
  doSomething = (myType: T, count: number) => {
    // ...
  }
}

const myTest = new MyTestClass<'hello' | 'goodbye'>()

// 取doSomething方法的第一个参数类型,就是初始化时传入的泛型
const myNewMethod = (subType: Parameters<typeof myTest.doSomething>[0]) => {
  // 此处subType的类型自动推导为 'hello' | 'goodbye',符合预期
}

方案2:用infer条件类型提取泛型(通用场景)

如果你的泛型不一定直接绑定在某个公开方法参数上,可以编写专门的类型提取工具,通过infer关键字推断类实例对应的泛型参数:

// 工具类型:提取MyTestClass实例的泛型参数
type ExtractMyTestGeneric<InstanceType> = InstanceType extends MyTestClass<infer T> ? T : never;

class MyTestClass<T> {
  // 就算类内部逻辑调整,只要泛型参数位置不变,提取逻辑就有效
  doSomething = (myType: T, count: number) => {
    // ...
  }
}

const myTest = new MyTestClass<'hello' | 'goodbye'>()

const myNewMethod = (subType: ExtractMyTestGeneric<typeof myTest>) => {
  // subType类型同样为 'hello' | 'goodbye'
}
注意点
  • 以上两种方式都是纯类型层面的操作,不会产生额外的运行时代码
  • 后续如果你修改实例初始化时传入的泛型,比如改成'hi' | 'bye',函数参数类型会自动同步更新,不需要手动维护两处类型定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:18:25