如何从实现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
相关产品推荐
相关产品推荐

