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

如何从实现B<string>的类A中推断出string类型?

从实现泛型接口的类中推断泛型类型

可行,但需要调整推断逻辑,原方法失败的原因有两点:

  • 类A实现B<string>时,TypeScript仅做结构兼容性校验,不会在A的实例类型中保留它实现的是B<string>的泛型关联信息,泛型参数会被擦除。
  • A未定义bla属性,通过{ bla?: infer T }的结构推断无法定位到目标string类型。

以下是几种可行的实现方式:

方案1:通过构造函数类型反向推断

无需修改类A的定义,借助构造函数类型提取泛型参数:

interface B<T> {
  bla?: T;
}

class A implements B<string> {}

// 辅助类型:从构造函数返回的实例中提取B的泛型参数
type ExtractBType<T> = T extends new () => B<infer U> ? U : never;

// 正确推断出string类型
type thisShouldBeString = ExtractBType<typeof A>; // string

方案2:给类添加类型标记(不影响运行时)

如果允许修改类A,可以添加一个私有属性用于类型推断(运行时可被优化移除):

interface B<T> {
  bla?: T;
}

class A implements B<string> {
  // 仅用于标记类型,无实际运行时作用
  private readonly _blaType?: string;
}

// 直接通过接口泛型推断
type thisShouldBeString = A extends B<infer T> ? T : never; // string

方案3:使用泛型类定义

将A定义为泛型类,显式绑定泛型参数:

interface B<T> {
  bla?: T;
}

// 泛型类,默认参数设为string
class A<T = string> implements B<T> {}

// 推断泛型参数
type thisShouldBeString = A extends B<infer T> ? T : never; // string

内容的提问来源于stack exchange,提问作者Page not found

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:53:22