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

TypeScript中GetReturnType为何推断出number?参数如何匹配never[]?

TypeScript中GetReturnType类型的疑问解答

先看对应的代码:

type GetReturnType<Type> = Type extends (...args: never[]) => infer Return
  ? Return
  : never;

type Num = GetReturnType<(b:number) => number>;

为什么Num会被推断为number?

GetReturnType是一个条件类型,逻辑很直接:检查传入的Type是否为函数类型,如果是,就用infer关键字提取该函数的返回值类型;否则返回never。

当我们传入(b:number) => number时,TypeScript会把这个函数类型和(...args: never[]) => infer Return的模式匹配——只要是函数类型就能匹配成功。匹配后,infer Return会自动捕获该函数的返回值类型number,所以最终Num的类型就是number。

为什么参数b:number能满足(...args: never[])?

这里核心是TypeScript函数类型的逆变规则:判断函数类型F是否继承(extends)函数类型G时,G的参数类型必须是F参数类型的子类型(换句话说,F的参数类型是G参数类型的超类型)。

never是TypeScript最底层的类型,它是所有类型的子类型,自然也属于number的子类型。而(...args: never[])代表“接受任意数量never类型参数”的函数类型,我们传入的(b:number) => number参数类型是number,因为never extends number成立,符合逆变规则,所以这个函数类型能成功匹配目标模式。

其实你也可以把(...args: never[])看作是一个通用函数类型占位符——我们的目标只是提取返回值,参数部分用never[]只是用来匹配任意函数类型的写法,不用纠结它的具体参数限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:37:08