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

如何在TypeScript中等待并排除拒绝状态的Promise列表?

推荐的TypeScript实现方式

原代码的类型问题在于:Promise.allSettled返回的数组元素类型是PromiseSettledResult<T>,即便过滤出status === "fulfilled"的项,TypeScript默认无法自动推断这些项的类型为PromiseFulfilledResult<T>,导致后续传给Promise.all时出现类型不兼容。

以下是两种可靠的解决方式:

方式一:使用类型守卫函数(更安全)

定义一个类型守卫函数,明确告知TypeScript哪些项是成功的结果,同时可按需提取原Promise的resolved值:

function isFulfilled<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T> {
  return result.status === 'fulfilled';
}

async function filterFulfilled<T>(list: Promise<T>[]) {
  const peers = await Promise.allSettled(list);
  const fulfilledResults = peers.filter(isFulfilled);
  // 若需要获取原Promise的返回值,映射出value
  return fulfilledResults.map(r => r.value);
  // 若只需保留FulfilledResult对象,直接返回即可(类型已被正确推断)
  // return fulfilledResults;
}

方式二:使用类型断言(更简洁)

如果能确保过滤后的数组全是成功结果,可直接用类型断言,但这种方式安全性低于类型守卫(若过滤逻辑出错,会引发类型错误):

async (list: Promise<unknown>[]) => {
  const peers = await Promise.allSettled(list);
  const fulfilledPeers = peers.filter(peer => peer.status === "fulfilled") as PromiseFulfilledResult<unknown>[];
  // 按需提取value或直接返回结果对象
  return fulfilledPeers.map(p => p.value);
}

补充说明

原JavaScript代码里的return Promise.all(peers)其实多余,因为peers已经是同步数组(非Promise数组),Promise.all会直接resolve该数组。如果你的目标是获取所有成功Promise的返回值,直接提取value组成数组返回即可,无需嵌套Promise.all。

内容的提问来源于stack exchange,提问作者Rillian Grant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:45:42