优化处理PromiseSettledResult数组的TypeScript函数类型定义
优化Promise.allSettled结果处理函数的类型精准性
问题背景
你需要编写一个函数,接收Promise.allSettled返回的PromiseSettledResult[]数组,返回包含已兑现值或已拒绝原因的数组。现有实现需要手动指定联合类型,导致返回数组的元素类型是所有可能结果的联合,无法区分每个位置的具体类型。
解决方案
利用TypeScript的泛型、条件类型和映射类型,可以实现无需手动指定联合类型,且返回数组每个元素类型精准对应原结果数组对应位置的类型。
1. 定义类型工具
首先定义两个类型工具,用于提取PromiseSettledResult中的值或原因,并映射到整个数组:
// 提取单个PromiseSettledResult对应的值/原因类型 type ExtractSettledValue<T extends PromiseSettledResult<unknown>> = T is PromiseFulfilledResult<infer V> ? V : T is PromiseRejectedResult ? T['reason'] : never; // 映射整个数组,为每个位置生成对应的精准类型 type ExtractSettledValues<T extends readonly PromiseSettledResult<unknown>[]> = { [K in keyof T]: ExtractSettledValue<T[K]> };
2. 实现处理函数
基于上述类型工具,编写处理函数:
function extractSettledResults<T extends readonly PromiseSettledResult<unknown>[]>( results: T ): ExtractSettledValues<T> { return results.map(result => { return result.status === 'fulfilled' ? result.value : result.reason; }) as ExtractSettledValues<T>; }
3. 测试示例
使用该函数时,TypeScript会自动推断返回数组每个元素的精准类型:
(async () => { const results = await Promise.allSettled([ Promise.resolve('成功返回的字符串'), Promise.reject(new Error('出错原因')), Promise.resolve(123) ]); const extracted = extractSettledResults(results); // extracted的类型为:[string, Error, number] console.log(extracted[0]); // 类型为string console.log(extracted[1]); // 类型为Error console.log(extracted[2]); // 类型为number })();
关键说明
- 泛型
T约束为readonly PromiseSettledResult<unknown>[],确保输入是Promise.allSettled返回的结果数组。 - 映射类型
{ [K in keyof T]: ... }遍历输入数组的每个索引,为每个位置生成对应的精准类型。 - 使用类型断言
as ExtractSettledValues<T>是因为TypeScript的Array.map方法无法自动推断元组类型的精准映射,需要手动告诉编译器返回值的类型。
内容的提问来源于stack exchange,提问作者jroy
相关产品推荐
相关产品推荐

