javascript - 使用 Promise.allSettled 时的 TypeScript 问题
问题描述
我有:
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'.
有没有更好的方法来输入这个?
解决方案
条件链接不会改变这样一个事实,即从类型的角度来看,您正在尝试使用不存在的属性。如果属性包含 value ,它只是为您的诉讼辩护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);
推荐阅读
- python - 使用循环反转字符串的函数
- python-3.x - How can I save a PNG image greater than 90 KB?
- java - Elasticsearch Java API:[eventDefinitions] 的对象映射尝试将字段 [null] 解析为对象,但找到了具体值?
- node.js - 如何编译 JSX 服务器端
- php - 单击删除按钮时,我必须单击两次才能将删除请求发布到 MYSQL Server
- python - 从分割的平铺图像拼接回 label_image 数组
- python - 在 opencv2 中加载 ONNX 模型失败并出现 blob.type() 断言错误
- python - 如何在 2 个不同的二维数组上执行广播(Python / numpy)
- flutter - 如何在 BoxDecoration 中为 Tab 添加边距?
- node.js - 无法使用 Bitbucket Pipeline 将 Angular 8 应用程序部署到 Heroku