泛型类型使用infer时,三元运算符else分支为何无法解析推断类型?
TypeScript条件类型中else分支
T报错的原因及解决思路 问题场景
你定义了一个包装类型:
type Wrap<T> = { data: T };
尝试写一个反向提取内部类型的工具类型时,else分支的T报错Cannot find name 'T':
type Unwrap<W> = W extends Wrap<infer T> ? T : T; // 报错的代码
报错原因
核心逻辑是**infer推断的类型变量仅在匹配成功的分支有效**:
- 当你写
W extends Wrap<infer T>时,T是TypeScript在**条件匹配成功(即W确实是Wrap类型)**时才临时生成的局部类型变量,它的作用域仅限于?之后的分支。 - 进入
:后的else分支时,因为条件不匹配,infer T的逻辑根本没触发,T这个变量从未被定义过,所以编译器直接报错找不到标识符。
解决思路(针对你实际场景的需求)
既然你不想用never,而是要对else分支的类型做自定义操作,直接基于输入类型W本身处理即可,或者明确else分支的目标类型:
示例1:else分支返回原类型加自定义标记
// 当W不是Wrap类型时,返回带错误标记的原类型 type Unwrap<W> = W extends Wrap<infer T> ? T : { source: W; type: "non-wrap" };
示例2:约束输入类型,让else分支有明确的类型可处理
如果希望Unwrap只接受Wrap或特定结构的类型,可以先给泛型加约束:
// 约束W要么是Wrap类型,要么是带fallback字段的类型 type Unwrap<W extends Wrap<any> | { fallback: unknown }> = W extends Wrap<infer T> ? T : W["fallback"];
示例3:else分支返回自定义默认类型
如果需要一个固定的默认类型,直接写具体类型即可:
type Unwrap<W> = W extends Wrap<infer T> ? T : string; // 这里可以替换成你需要的任意类型逻辑
内容的提问来源于stack exchange,提问作者wlf
相关产品推荐
相关产品推荐

