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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:45:30