跳至主要内容

use-unknown-in-catch-callback-variable

强制在 .catch() 回调函数中将类型参数指定为 unknown

🔧

此规则报告的一些问题可以通过 --fix ESLint 命令行选项 自动修复。

💡

此规则报告的一些问题可以通过编辑器 建议 手动修复。

💭

此规则需要 类型信息 才能运行。

此规则强制您始终对 Promise.prototype.catch() 回调函数的参数使用 unknown 类型。

Promise.reject(new Error('I will reject!')).catch(err => {
console.log(err);
});

Promise.reject(new Error('I will reject!')).catch((err: any) => {
console.log(err);
});

Promise.reject(new Error('I will reject!')).catch((err: Error) => {
console.log(err);
});
在游乐场中打开

此规则的原因是使程序员能够对 Promise 错误处理施加约束,类似于 TypeScript 对普通异常处理提供的约束。

对于普通异常,TypeScript 默认将 catch 变量视为 any。但是,unknown 将是一个更准确的类型,因此 TypeScript 引入了 useUnknownInCatchVariables 编译器选项,将 catch 变量视为 unknown

try {
throw x;
} catch (err) {
// err has type 'any' with useUnknownInCatchVariables: false
// err has type 'unknown' with useUnknownInCatchVariables: true
}

try-catch 块的 Promise 类比,Promise.prototype.catch(),不受 useUnknownInCatchVariables 编译器选项的影响,其“catch 变量”将始终具有 any 类型。

Promise.reject(x).catch(err => {
// err has type 'any' regardless of `useUnknownInCatchVariables`
});

但是,您仍然可以提供显式类型注释,这使您能够实现与 useUnknownInCatchVariables 选项对同步 catch 变量所做的一样的效果。

Promise.reject(x).catch((err: unknown) => {
// err has type 'unknown'
});
信息

实际上,有一种方法可以让 catch() 回调变量使用 unknown 类型,而无需在调用点进行显式类型标注,但它有一个缺点,即它涉及覆盖全局类型声明。例如,库 better-TypeScript-lib 为您的项目全局设置了这一点(请参阅 better-TypeScript-lib 源代码中的相关行 以了解详细信息)。

有关此方面的进一步阅读,您可能还想查看 此规则提案中的讨论此 TypeScript 问题,关于将 catch 回调变量类型化为 unknown

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/use-unknown-in-catch-callback-variable": "error"
}
};

在游乐场中尝试此规则 ↗

选项

此规则不可配置。

何时不使用它

如果您的代码库还无法启用 useUnknownInCatchVariables,那么启用此规则可能也同样困难。

如果您修改了全局类型声明以使 catch() 回调在没有显式类型标注的情况下使用 unknown 类型,则不需要此规则。


类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查的规则后遇到性能下降,请参阅 性能故障排除

资源