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

如何为memorifyFuncs返回的函数获取对应返回值类型?

解决异步缓存工具函数的类型推导问题

问题根源

原代码的类型定义存在三个关键缺陷:

  • 异步函数asyncFunc的返回值用any类型,丢失了具体类型信息,导致后续处理函数的参数类型无约束
  • 处理函数数组createFuncs没有关联到asyncFunc的返回值类型,类型推导不严谨
  • Array.map默认返回联合类型数组,无法保留输入函数的顺序对应关系,导致返回的函数数组类型模糊

修正后的代码

interface Model {
  bar: number
  foo: string
}

async function getSth(a: number, b: string): Promise<Model> {
  return await Promise.resolve({
    bar: a,
    foo: b,
  })
}

function createA(m: Model): number {
  return m.bar
}

function createB(m: Model): string {
  return m.foo
}

function memorifyFuncs<T extends any[], R>(asyncFunc: (...args: T) => Promise<R>) {
  return <Fs extends ((arg: R) => any)[]>(...createFuncs: Fs) => {
    const cache: Record<string, R> = {}

    return createFuncs.map(
      <F extends (arg: R) => any>(func: F) =>
        async (...args: T): Promise<ReturnType<F>> => {
          const key = args.map((arg) => JSON.stringify(arg)).join('&')
          if (!cache[key]) {
            cache[key] = await asyncFunc(...args)
          }
          return func(cache[key])
        }
    ) as { [K in keyof Fs]: (...args: T) => Promise<ReturnType<Fs[K]>> }
  }
}

// 使用示例
const [cachedCreateA, cachedCreateB] = memorifyFuncs(getSth)(createA, createB)
// cachedCreateA 类型:(a: number, b: string) => Promise<number>
// cachedCreateB 类型:(a: number, b: string) => Promise<string>

关键类型调整说明

  1. 新增泛型R:明确asyncFunc的返回值类型,替代原代码的any,让缓存对象cache的类型也绑定为R,保证类型安全
  2. 约束处理函数类型:限定Fs中的每个函数必须接收R作为参数,确保处理函数与异步函数的返回值强关联
  3. 元组类型断言:将map返回的数组转为元组类型,保留输入函数的顺序对应关系,让TypeScript能准确推导每个返回函数的具体类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:53:14