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

TypeScript提取联合类型内部泛型返回unknown的原因与解决方法

问题原因

这个现象是TypeScript的分布式条件类型特性导致的,核心逻辑如下:

  • 当条件类型的待检查类型是「裸类型参数」(没有被元组、数组等包装的纯类型参数)时,传入联合类型会触发分发逻辑:将联合的每个成员单独带入条件判断,最后把所有分支的结果合并为新的联合类型。
  • 你定义的extractGeneric<Type>中,条件Type extends Either<infer X>的左侧是裸类型参数Type。当传入Either<number>时,本质是对error | success<number>这个联合做分发处理:
    • 对error分支:error extends Either<infer X>成立,但error类型不携带泛型参数X的任何信息,TS会将X推断为unknown
    • 对success<number>分支:success<number> extends Either<infer X>成立,X被推断为number
  • 两次结果合并为unknown | number,而unknown和任意类型的联合结果都是unknown,这就是你拿到unknown的原因。
  • 你写的innerType2的条件左侧是具体的联合类型,不是裸类型参数,不会触发分发逻辑,直接整体匹配Either<infer X>,所以能正确推断出X为number。
通用解决方法

只需要关闭分布式条件类型的分发特性即可,标准做法是把条件判断的左右两侧都用元组包装,让类型参数不再是裸类型:

// 修改后的泛型提取类型
type extractGeneric<Type> = [Type] extends [Either<infer X>] ? X : never

// 测试结果符合预期
type innerType = extractGeneric<Either<number>>; // 类型为 number

内容的提问来源于stack exchange,提问作者fYre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:06:04