use-unknown-in-catch-callback-variable
强制在
.catch()
回调函数中将类型参数指定为unknown
。
此规则强制您始终对 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.reject(new Error('I will reject!')).catch((err: unknown) => {
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。
module.exports = {
"rules": {
"@typescript-eslint/use-unknown-in-catch-callback-variable": "error"
}
};
在游乐场中尝试此规则 ↗
选项
此规则不可配置。
何时不使用它
如果您的代码库还无法启用 useUnknownInCatchVariables
,那么启用此规则可能也同样困难。
如果您修改了全局类型声明以使 catch()
回调在没有显式类型标注的情况下使用 unknown
类型,则不需要此规则。
类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查的规则后遇到性能下降,请参阅 性能故障排除。