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

TypeScript如何根据入参函数返回值推导包装函数的返回类型

问题描述

有一个接收函数作为入参的函数,入参函数的返回值属于若干枚举/字面量值中的一种,如何通过入参函数的返回类型,推导外层包装函数的返回类型?
示例场景如下:

const foo = { a: 1, b: '2' }

function h(k: (() => 'a' | 'b')) {
  return foo[k()]
}

const d = h(() => 'a') 
// 预期:d的类型为number
// 实际:d的类型为number | string
解决方案

你需要通过泛型捕获入参函数的返回字面量类型,再结合索引访问类型映射出外层函数的返回类型,具体实现如下:

const foo = { a: 1, b: '2' }

// 泛型T约束为foo的合法键类型,入参函数返回T,外层函数返回foo对应T的属性类型
function h<T extends keyof typeof foo>(k: () => T): typeof foo[T] {
  return foo[k()]
}

const d = h(() => 'a') 
// 此时d的类型符合预期为number
const e = h(() => 'b')
// e的类型符合预期为string

原理解释

  • 原写法将入参函数的返回类型固定写死为'a' | 'b'联合类型,TS无法捕获每次调用时传入的具体返回值类型,自然只能推导出联合的返回值类型。
  • 新增的泛型参数T会在每次调用h函数时,自动根据入参函数的返回值推导对应的具体字面量类型(比如调用时传入返回'a'的函数,T就会被推导为'a'而非联合类型)。
  • 最后通过索引访问类型typeof foo[T]就能精准映射出对应属性的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:45:03