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

能否创建从外部对象属性推断类型的TypeScript泛型函数?

当然可以!我们只需要调整泛型的定义,让它能准确捕获传入 resolver 函数的参数类型和返回类型,就能实现完全的类型镜像效果。

修正后的 createResolver 实现

首先重构泛型函数,让它能适配任意函数类型并保留完整的类型信息:

function createResolver<T extends (...args: any[]) => any>(resolverFn: T): T {
  return (...args: Parameters<T>): ReturnType<T> => {
    // 在这里添加你的额外逻辑,比如日志、权限校验、参数预处理等
    console.log("执行 resolver 前置逻辑...");
    // 调用原始 resolver 函数并返回结果
    return resolverFn(...args);
  } as T;
}

关键类型逻辑解释

  • 泛型 T 被定义为任意函数类型(extends (...args: any[]) => any),这样它可以匹配任何带有参数和返回值的函数,不再局限于无参无返回的 () => void。
  • 返回类型直接设为 T,确保返回的函数和传入的 resolverFn 类型完全一致。
  • 内部函数用 Parameters<T> 自动提取 T 的参数类型数组,用 ReturnType<T> 提取 T 的返回类型,保证参数传递和返回值的类型安全。
  • 最后用 as T 做类型断言(这是安全的,因为我们的实现完全符合 T 的结构),帮助 TypeScript 确认返回值的类型就是 T。

完整使用示例

const resolversMap = { 
  overallRankingPlacement: createResolver((issuer: number, args: Record<string, any>, context: Record<string, any>) => { 
    return Promise.resolve(0); // 返回与定义匹配的 Promise<number>
  }), 
};

// 此时类型推断完全生效:
// resolversMap.overallRankingPlacement 的类型为:
// (issuer: number, args: Record<string, any>, context: Record<string, any>) => Promise<number>

现在不管你传入什么样的 resolver 函数,createResolver 都会精准镜像它的参数类型、返回类型,完全满足你“类型层面全面镜像/代理”的需求,同时还能插入自定义的额外逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:02:40