如何为接收映射函数的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
相关产品推荐
相关产品推荐

