【问题标题】: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);
    

    【讨论】:

      猜你喜欢
      • 2020-08-15
      • 2020-09-21
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 2016-07-23
      • 2021-05-23
      • 2019-11-20
      相关资源
      最近更新 更多