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

如何为接收映射函数的TypeScript函数定义返回类型?

TypeScript 泛型函数类型定义:根据映射函数返回值推断结果类型

你的问题核心是没正确利用泛型推断机制,原来的MapperFunction把泛型参数定义在类型本身,导致TypeScript无法在调用myFunction时准确推断映射函数的返回类型。正确做法是将myFunction定义为泛型函数,让它根据传入的映射函数自动推断返回类型,无需单独定义带泛型的MapperFunction类型。

修改后的代码如下:

const myObject = {
  a: 1,
  b: 2
} as const

// 更安全的identity函数,避免使用any
const identity = <T>(arg: T) => arg

// 将myFunction定义为泛型函数,R代表映射函数的返回类型
const myFunction = <R>(mapper: (arg: typeof myObject) => R = identity) => mapper(myObject)

// 此时类型推断正常工作
const theValueOfA = myFunction(({a}) => a) // 类型为1
const theValueOfAPlusB = myFunction(({a,b}) => a+b) // 类型为3

原写法报错原因

原来的MapperFunction = <R>(arg: typeof myObject) => R是一个泛型函数类型,意味着这个函数调用时可以指定任意R类型。但当它作为参数传给myFunction时,TypeScript无法确定你实际需要的R是什么,因此会抛出R无法推断的错误。

将myFunction定义为泛型函数后,<R>会在调用时根据传入映射函数的返回值自动推断具体的R类型,完美匹配需求。

如果一定要单独定义映射函数类型,可调整为:

type MapperFunction<R> = (arg: typeof myObject) => R

const myFunction = <R>(mapper: MapperFunction<R> = identity) => mapper(myObject)

这里把泛型参数R移到类型别名层面,让MapperFunction成为依赖R的泛型类型,同样能实现正确的类型推断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:00:47