如何在TypeScript中获取参数函数列表的ReturnType?
解决TypeScript中函数参数返回类型组成元组的问题
你的核心问题在于当前泛型约束会将所有传入函数统一推断为同一类型,导致返回值被识别为单一类型的数组。要实现各参数函数返回类型组成的元组,需要借助可变元组泛型和映射类型来精准捕获每个函数的返回类型:
修正后的实现代码
const funcA = async (): string => "Hello"; const funcB = async (): { name: string, age: number } => ({ name: "Jane", age: 123 }); // 使用可变元组泛型捕获每个传入函数的具体类型 const myMainFunction = async <T extends readonly (() => Promise<any>)[]>( ...functions: T ): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K]>> }> => { const res = await Promise.all(functions.map(fn => fn())); // 类型断言匹配元组返回类型(TS 4.0+已原生支持Promise.all的元组推断,断言可进一步确保准确性) return res as { [K in keyof T]: Awaited<ReturnType<T[K]>> }; }; // 此时values类型为Promise<[string, { name: string; age: number; }]>,符合预期 const values = await myMainFunction(funcA, funcB);
关键逻辑说明
- 可变元组泛型:
T extends readonly (() => Promise<any>)[]让TypeScript将传入的函数参数推断为元组类型,而非统一的数组类型,保留每个函数的独立类型信息。 - 映射类型:
{ [K in keyof T]: Awaited<ReturnType<T[K]>> }遍历元组的每个索引,提取对应函数的返回类型,并通过Awaited解包异步函数的Promise包装,得到原始返回类型。 - 兼容同步函数:如果需要支持同步、异步函数混合传入,只需将泛型约束改为
T extends readonly (() => any)[],同时用Promise.resolve()包裹函数调用,Awaited会自动处理同步返回值:const syncFunc = (): number => 123; const myMainFunction = async <T extends readonly (() => any)[]>( ...functions: T ): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K]>> }> => { const res = await Promise.all(functions.map(fn => Promise.resolve(fn()))); return res as { [K in keyof T]: Awaited<ReturnType<T[K]>> }; }; // values类型为Promise<[string, { name: string; age: number; }, number]> const values = await myMainFunction(funcA, funcB, syncFunc);
内容的提问来源于stack exchange,提问作者Carven
相关产品推荐
相关产品推荐

