我想要得到所有被拒绝的承诺。然而,即使我过滤掉了那些被拒绝的承诺,我的打字记录解释器仍然显示出这些承诺仍然可以实现。它发生在下面的代码中。
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>'.
错误,即使我已经过滤了列表以确保它只包含被拒绝的承诺?我怎么才能解决这个问题?
发布于 2022-07-21 10:56:07
问题
Array.filter
的类型如下所示:
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
的扩展,其中T
是value
的类型。在您的情况下,value
是results
,它有一种类型的PromiseSettledResult<void>[]
,因此出现了错误。
解决方案
TypeScript本身无法理解result.status === 'rejected'
将数组过滤为只被拒绝的承诺。您可以使用类型谓词帮助TypeScript缩小您的类型:
const errors = results.filter(
(result): result is PromiseRejectedResult =>
result.status === 'rejected'
)
https://stackoverflow.com/questions/73064240
复制相似问题