如何在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
相关产品推荐
相关产品推荐

