方法 getData() 返回 Promise
Output[]
但是当我尝试将 catch 语句放在 getData() 方法前面时,数据类型变为
Output[] | void
并且我可以理解,如果在获取数据时出现错误,那么我不会从 catch 块返回任何内容。
当我尝试从 catch 语句返回一个空数组时,打字稿推断的数据类型是
Output[] | never[]
。我无法理解从不[]的概念
我无法理解 never[] 的概念。在这种情况下,处理错误并获取预期类型的数组而不是
void
或 never
的最佳实践/解决方案是什么。
const data = await getData().catch((e) => {
handleError(e);
return [];
});
当你使用 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();
当您返回
[]
时,TS 假定它始终是一个空数组。它是一个有 0 个元素的元组类型。这就是为什么你会得到 never[]
。因为你永远无法访问它的任何元素。
您可以将其更改为:
const data = await getData().catch((e) => {
handleError(e);
return [] as Output[];
});