首页 > 解决方案 > 使用 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'.

有没有更好的方法来输入这个?

标签: javascripttypescriptpromise

解决方案


条件链接不会改变这样一个事实,即从类型的角度来看,您正在尝试使用不存在的属性。如果属性包含 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);

推荐阅读