TypeScript中infer在函数交叉类型中选择类型的两个疑问
TypeScript交叉函数类型的infer推断疑问解答
首先给出目标类型定义:
type T = (() => 1) & (() => 2) extends () => infer R ? R : unknown
问题1:为什么类型T的结果不是never(即1 & 2)?
在当前TypeScript 5.x及以上版本中,type T的结果就是never(等同于1 & 2)。如果你的测试结果不是never,可能是使用了旧版本TS或代码书写有误。
从TS类型系统逻辑来看,原因如下:
- 函数交叉类型
(() => 1) & (() => 2)代表一个同时符合两个函数类型的函数,它的返回值是两个分支返回值的交叉类型; - 当通过
extends () => infer R推断返回类型时,TS会直接将交叉函数的返回值作为R的结果。由于字面量类型1和2没有公共子类型,1 & 2的结果就是never。
问题2:infer推断出的类型总是取自最后一个函数,还是可取自任意一个函数?
都不是。针对交叉函数类型的返回值推断,TS的逻辑是取所有分支返回值的交叉类型,而非某一个分支的类型:
- 如果所有分支返回类型完全一致,推断结果就是这个相同的类型;
- 如果分支返回类型有公共子类型,推断结果为它们的交集;
- 如果分支返回类型无交集,推断结果就是
never。
内容的提问来源于stack exchange,提问作者Ilya Ordin
相关产品推荐
相关产品推荐

