如何调用泛型函数并匹配泛型参数以保留返回类型?
解决TypeScript高阶函数保留依赖参数的返回类型问题
你的问题出在原函数的泛型参数与callFunction的泛型参数没有正确关联,导致TypeScript无法推断出依赖于输入参数的返回类型。当原函数是泛型函数时,直接将其作为泛型约束类型传入callFunction,TypeScript无法将你传入的具体参数类型与原函数的泛型参数绑定,最终返回类型只能是unknown。
修正方案
我们需要让callFunction的泛型参数直接关联原函数的输入输出类型,而不是捕获整个原函数类型。以下是两种可行的写法:
基础版(单参数)
function f<A>(args: A) { return args; } const result = f('test'); // 类型为'test',符合预期 // 修正后的callFunction function callFunction<T, R>( fn: (arg: T) => R, arg: T ): R { return fn(arg); } const result2 = callFunction(f, 'test'); // 类型为'test',符合预期
通用版(支持多参数)
如果需要处理带多个参数的函数,可以使用剩余参数语法来适配:
function callFunction<T extends any[], R>( fn: (...args: T) => R, ...args: T ): R { return fn(...args); } // 测试多参数泛型函数 function g<A, B>(a: A, b: B) { return [a, b] as const; } const result3 = callFunction(g, 123, 'abc'); // 类型为readonly [number, string]
原写法失效原因
原代码中的ReturnTypeWithArgs试图通过F extends (args: A) => infer R来推断返回类型,但当F是泛型函数(比如<A>(args: A) => A)时,这里的泛型参数A与你定义的ReturnTypeWithArgs的泛型参数A并非同一变量,TypeScript无法建立两者的关联关系,因此无法正确推导R的类型,最终返回unknown。
内容的提问来源于stack exchange,提问作者Tom Esterez
相关产品推荐
相关产品推荐

