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

如何调用泛型函数并匹配泛型参数以保留返回类型?

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:05:31