如果指定,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
。
您可以使用此方法来检查块中的错误变量是否是任何特定类的实例,即使您有类。
catch
Error
CustomError
message
只有当我们缩小了块中的类型范围后,才能安全地访问该属性if
,否则变量的类型err
为unknown
。
使用类型断言解决错误
如果这种方法对您不起作用并且您需要在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); } }
我们err
在catch
块中显式键入变量,即使无法保证所有捕获的错误都是特定类型。
解决使用时的错误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
,例如
config
、code
和。request
response
我还写了一篇关于
如何在 TypeScript 中使用 Axios 发出 HTTP 请求的详细指南。
如果您更愿意使用内置的获取模块,请查看以下
文章。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: