如何为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>
关键类型调整说明
- 新增泛型R:明确
asyncFunc的返回值类型,替代原代码的any,让缓存对象cache的类型也绑定为R,保证类型安全 - 约束处理函数类型:限定
Fs中的每个函数必须接收R作为参数,确保处理函数与异步函数的返回值强关联 - 元组类型断言:将
map返回的数组转为元组类型,保留输入函数的顺序对应关系,让TypeScript能准确推导每个返回函数的具体类型
内容的提问来源于stack exchange,提问作者jimin hu
相关产品推荐
相关产品推荐

