当使用 async/await 方法从 catch 语句返回空数组时,打字稿推断 never[]

问题描述 投票:0回答:2

方法 getData() 返回 Promise 没有 catch 语句推断的数据类型是

Output[]

但是当我尝试将 catch 语句放在 getData() 方法前面时,数据类型变为

Output[] | void
并且我可以理解,如果在获取数据时出现错误,那么我不会从 catch 块返回任何内容。

当我尝试从 catch 语句返回一个空数组时,打字稿推断的数据类型是

Output[] | never[]
。我无法理解从不[]

的概念

我无法理解 never[] 的概念。在这种情况下,处理错误并获取预期类型的数组而不是

void
never
的最佳实践/解决方案是什么。

  const data = await getData().catch((e) => {
    handleError(e);
    return [];
  });
node.js typescript typescript-typings
2个回答
1
投票

当你使用 async/await 时,一般的做法是用 try/catch 包装它。这有助于打字稿推断类型。

例如,

async function getData() {
  return [1];
}

// inferred as `number[] | never[]` because .catch adds additional types. 
// The returned value could be the type from getData or the type from the catch function. 
// Promise<number[]>.catch<never[]>
const data = await getData().catch(e => {
  ...
})

如果你用 try/catch 包装它

  try {
    // inferred as `number[]`
    const data = await getData();
    return data;
  } catch (e) {
    handleError(e);
    return [];
  }

这是一个完整的示例。

async function getData() {
  return [1];
}

function handleError(e: any) {
  console.log(e);
}

async function main() {
  try {
    const data = await getData();
    return data;
  } catch (e) {
    handleError(e);
    return [];
  }
}

main();

1
投票

当您返回

[]
时,TS 假定它始终是一个空数组。它是一个有 0 个元素的元组类型。这就是为什么你会得到
never[]
。因为你永远无法访问它的任何元素。

您可以将其更改为:

const data = await getData().catch((e) => {
  handleError(e);
  return [] as Output[];
});
© www.soinside.com 2019 - 2024. All rights reserved.