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
相关产品推荐
相关产品推荐

