为什么TypeScript无法正确推断该场景下的泛型Context参数?
问题原因
这个问题由TypeScript的泛型推断规则和方法参数类型兼容性规则共同导致:
- 当
Parser类存在exec抽象方法时,TypeScript执行T extends Parser<any, infer C>的匹配逻辑时,会深度对比两个类的所有成员类型来推导泛型参数。你在LiteralParser的exec实现中,将第一个参数options的类型硬写为ParseOptions<any>,和父类exec的ParseOptions<Context>参数做兼容性校验时,参数位置的any会污染Context的推断结果,最终返回any。 - 当你移除
exec方法后,类中没有任何成员引用Context泛型参数,TypeScript会跳过成员兼容性校验,直接从类的泛型声明位提取参数类型,就能得到预期的unknown。
修复方案
将LiteralParser的exec方法参数类型和父类对齐即可:
exec(options: ParseOptions<Context>, internals: Internals) { // 原有业务逻辑 return null; }
修复后type A = Extr<LiteralParser<string, unknown>>的推导结果为unknown,符合预期。
内容的提问来源于stack exchange,提问作者strblr
相关产品推荐
相关产品推荐

