TypeScript中使用infer推导泛型类内部类型时出现类型不匹配报错
TS 使用
infer 从泛型提取类型时报赋值不兼容的修正方案 报错核心原因
问题本质是对 TS 的 多态this(polymorphic this) 解析机制和 infer 推导时机的认知偏差:
FooHandler构造函数中写的F extends Foo<infer X> ? X : never属于延迟解析的条件类型:只要这个条件类型的输入参数是未确定的类型(比如此处传入的this),TS 就不会提前计算它的最终取值。- TS 不会自动把当前
Foo类方法里已知的参数类型x: X,和延迟条件类型里infer推导出的结果做等价绑定。毕竟this是支持被子类协变重写的,TS 无法默认假设:所有继承自Foo<X>的子类,传入构造函数的x一定和当前类定义的X完全匹配。
无额外泛型参数的修正写法
不需要给 FooHandler 增加独立的重复泛型参数,只需要在构造实例时,打通 TS 的类型解析链路,明确告知类型系统当前参数的匹配关系即可:
// 抽离通用的infer提取逻辑,避免重复写条件类型 type ExtractFooInner<T> = T extends Foo<infer Inner> ? Inner : never; class Foo<X> { public make(x: X): FooHandler<this> { // 最小范围的类型收窄,消除TS延迟解析带来的类型歧义 return new FooHandler(this as Foo<this>, x as ExtractFooInner<this>); } } class FooHandler<F extends Foo<any>> { public constructor( public f: F, public x: ExtractFooInner<F>, ) {} }
方案适配性说明
这种写法完全匹配你的设计目标:
- 依然通过
infer从Foo的泛型参数中提取关联类型,不需要在FooHandler上额外声明和Foo内部泛型重复的类型参数 - 不破坏子类继承时的多态行为:子类调用
make方法时,FooHandler依然能自动匹配到子类对应的泛型类型 - 类型收窄的断言范围极小,不会引入不必要的类型安全漏洞,仅用于补上 TS 延迟条件类型解析的天然盲区。
内容的提问来源于stack exchange,提问作者Maurice Robert
相关产品推荐
相关产品推荐

