首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“PromiseSettledResult<从不>”类型上不存在属性“理由”。即使我已经过滤了已经确定的结果,所以只有拒绝

“PromiseSettledResult<从不>”类型上不存在属性“理由”。即使我已经过滤了已经确定的结果,所以只有拒绝
EN

Stack Overflow用户
提问于 2022-07-21 10:04:52
回答 1查看 179关注 0票数 2

我想要得到所有被拒绝的承诺。然而,即使我过滤掉了那些被拒绝的承诺,我的打字记录解释器仍然显示出这些承诺仍然可以实现。它发生在下面的代码中。

代码语言:javascript
运行
复制
const promises = .... // generate a bunch of promises
const results = await Promise.allSettled(promises)

const errors = results.filter(result => result.status === 'rejected')

// Errors out here -> 'Property 'reason' does not exist on type 'PromiseSettledResult<never>''
const reasons = errors.map(error => error.reason)

为什么它会显示这个Property 'reason' does not exist on type 'PromiseSettledResult<never>'.错误,即使我已经过滤了列表以确保它只包含被拒绝的承诺?我怎么才能解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2022-07-21 10:56:07

问题

Array.filter的类型如下所示:

代码语言:javascript
运行
复制
filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];

- 类型记录/lib/lib.es5.d.ts#L 1367

您将能够看到返回类型是S,它是T的扩展,其中Tvalue的类型。在您的情况下,valueresults,它有一种类型的PromiseSettledResult<void>[],因此出现了错误。

解决方案

TypeScript本身无法理解result.status === 'rejected'将数组过滤为只被拒绝的承诺。您可以使用类型谓词帮助TypeScript缩小您的类型:

代码语言:javascript
运行
复制
const errors = results.filter(
  (result): result is PromiseRejectedResult =>
    result.status === 'rejected'
)

TypeScript游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73064240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档