【问题标题】:TypeScript issue when using Promise.allSettled使用 Promise.allSettled 时的 TypeScript 问题
【发布时间】:2021-10-03 07:55:02
【问题描述】:
我有:
const neuroResponses = await Promise.allSettled(neuroRequests);
const ret = neuroResponses.filter(response => response?.value?.data?.result[0]?.generated_text?.length > 0).map(({ value }) => value.data.result[0]?.generated_text);
但我遇到了 TypeScript 问题:
Property 'value' does not exist on type 'PromiseSettledResult<AxiosResponse<any>>'.
Property 'value' does not exist on type 'PromiseRejectedResult'.
有没有更好的输入方式?
【问题讨论】:
标签:
javascript
typescript
promise
【解决方案1】:
条件链接不会改变这样一个事实,即从类型的角度来看,您正在尝试使用不存在的属性。如果属性包含值undefined,它只是为您的诉讼辩护。您仍在尝试使用该类型上可能不存在的属性。
您可以使用类型保护来过滤掉失败的响应。例如,内联类型保护:
const neuroResponses = await Promise.allSettled(neuroRequests);
const ret = neuroResponses
.filter(response => "value" in response && response.value.data?.result[0]?.generated_text?.length > 0)
.map(({ value }) => value.data.result[0]?.generated_text);
如果你经常这样做,你可能需要一个类型保护函数:
function isSuccessful<T>(response: PromiseSettledResult<T>): response is PromiseFulfilledResult<T> {
return "value" in response;
}
那么你可以这样使用它:
const neuroResponses = await Promise.allSettled(neuroRequests);
const ret = neuroResponses
.filter(isSuccessful) // ***
.filter(response => response.value.data?.result[0]?.generated_text?.length > 0)
.map(({ value }) => value.data.result[0]?.generated_text);
或者
const neuroResponses = await Promise.allSettled(neuroRequests);
const ret = neuroResponses
.filter(response => isSuccessful(response) && response.value.data?.result[0]?.generated_text?.length > 0)
.map(({ value }) => value.data.result[0]?.generated_text);