如果指定,Catch 子句变量类型注释必须是 any 或 unknown

如果指定,catch 子句变量类型注释必须是 any 或 unknown

Catch clause variable type annotation must be any or unknown if specified

当我们尝试在块中键入错误变量时,会出现错误“Catch 子句变量类型注释必须是‘any’或‘unknown’” catch

要解决错误,请删除类型并使用类型保护来检查错误是否属于特定类型,例如if (err instanceof Error){}.

下面是错误如何发生的示例。

索引.ts
async function getNumber() { try { const result = await Promise.resolve(42); return result; // ⛔️ Error: Catch clause variable type annotation must be 'any' or 'unknown' if specified.ts(1196) } catch (err: Error) { console.log(err.message); } }

我们无法保证块中的错误catch将是Error
提前的实例,因此 TypeScript 将其类型设置为
未知以避免任何意外的运行时错误。

使用类型保护来解决错误

在访问特定属性之前,我们必须使用类型保护来缩小对象的类型范围。

索引.ts
async function getNumber() { try { const result = await Promise.resolve(42); return result; } catch (err) { if (err instanceof Error) { // 👉️ err is type Error here console.log(err.message); } console.log('Unexpected error', err); } }

我们使用
instanceof
运算符来检查是否
err是对象的实例Error

您可以使用此方法来检查块中的错误变量是否是任何特定类的实例,即使您有类。 catchError CustomError

message只有当我们缩小了块中的类型范围后,才能安全地访问该属性if,否则变量的类型errunknown

使用类型断言解决错误

如果这种方法对您不起作用并且您需要在catch块中键入错误变量,则可以使用
类型断言

索引.ts
async function getNumber() { try { const result = await Promise.resolve(42); return result; } catch (err) { const typedError = err as Error; console.log(typedError?.message); } }

我们errcatch块中显式键入变量,即使无法保证所有捕获的错误都是特定类型。

解决使用时的错误axios

如果您使用该axios包并需要在 catch 块中将错误键入为AxiosError,请使用isAxiosError()辅助函数。

索引.ts
import axios from 'axios'; async function getData() { try { // 👉️ ... fetch data here } catch (error) { if (axios.isAxiosError(error)) { console.log('error message: ', error.message); // 👇️ error: AxiosError<any, any> return error.message; } else { console.log('unexpected error: ', error); return 'An unexpected error occurred'; } } }

isAxiosError函数用作类型保护。

在块中if我们可以访问 an 具有的所有属性AxiosError,例如
configcoderequestresponse

我还写了一篇关于
如何在 TypeScript 中使用 Axios 发出 HTTP 请求的详细指南。

如果您更愿意使用内置的获取模块,请查看以下
文章

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: