使用promise.allselled时的类型脚本问题

ao218c7q  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(360)

我有:

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);

但我有一个打字稿问题:

Property 'value' does not exist on type 'PromiseSettledResult<AxiosResponse<any>>'.
  Property 'value' does not exist on type 'PromiseRejectedResult'.

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

agyaoht7

agyaoht71#

条件链接不会改变这样一个事实,即从类型的Angular 来看,您试图使用一个不存在的属性。如果该属性包含该值,则它只是针对您的程序进行辩护 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);

相关问题