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

如何在TypeScript泛型中让ReturnT可选并自动推断类型?

解决TypeScript泛型部分指定+自动推断问题

可行方案

方案1:用TS 4.7+的泛型占位符_

TypeScript 4.7及以上版本支持用_作为泛型参数的占位符,用来告诉编译器自动推断该参数的类型。这样你可以只指定第一个泛型ErrorT,第二个用_让TS自动从传入的函数推断ReturnT:

const wrap = <ErrorT, ReturnT>(func: () => ReturnT): ReturnT => {
  return func()
}

// 仅指定ErrorT,用_让TS自动推断ReturnT
const result = wrap<Error, _>(() => 22)
// result类型为number,符合预期

方案2:柯里化函数(兼容低版本TS)

如果需要支持TS 4.7以下版本,可以把函数拆成柯里化形式,先指定ErrorT,再传入函数让TS推断ReturnT:

const wrap = <ErrorT>() => <ReturnT>(func: () => ReturnT): ReturnT => {
  return func()
}

// 先指定ErrorT,再传入函数
const result = wrap<Error>()(() => 22)
// result类型为number,符合预期

方案3:调整泛型参数顺序+默认值

把需要自动推断的ReturnT放在泛型参数第一位并设置默认值,需要手动指定的ErrorT放在后面,调用时用_占位ReturnT让TS自动推断:

const wrap = <ReturnT = never, ErrorT>(func: () => ReturnT): ReturnT => {
  return func()
}

// 用_让TS推断ReturnT,再指定ErrorT
const result = wrap<_, Error>(() => 22)
// result类型为number,符合预期

为什么之前的尝试无效?

你之前给ReturnT设置默认值(void/any/unknown)时,一旦显式指定ErrorT,TS会直接使用默认值作为ReturnT的类型,不会再去推断函数返回值——默认值会覆盖自动推断逻辑。而extends约束只是限制类型范围,同样无法解决部分指定泛型时的推断冲突问题。

内容的提问来源于stack exchange,提问作者Алексей Соснин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:23:16