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

优化处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:38:15