⭐ 建议
目前有 useUnknownInCatchVariables
,它允许默认将 catch 中的错误类型更改为 unknown(从任何)。
使用相同的理由,我认为在类似的基础上增加 1 或 2 个选项是有意义的:
- useUnknownForAnyReturn:如果一个函数返回 "any",当调用该函数时将其视为 "unknown"。这对于第三方库尤其有用,但在一般情况下也是如此,因为 "unknown" 比 "any" 更严格(这就是例如 @typescript-eslint 有 "no-unsafe-assignment" 规则的原因 - 通常无法修复,因为 "any" 来自第三方包)
- useUnknownForAnyParamCallback:如果一个函数/回调没有指定任何类型,默认值为 any。如果设置了此标志,将其视为 "unknown" 而不是 "any",可以使检查更好。
🔍 搜索词
上述建议中提到的所有内容
✅ 可实现性检查清单
我的建议符合以下指导原则:
- 这不会对现有的 TypeScript/JavaScript 代码造成破坏性的更改
- 这不会改变现有 JavaScript 代码的运行时行为
- 这可以在不根据表达式的类型发出不同的 JS 的情况下实现
- 这不是运行时特性(例如库功能、JavaScript 输出的非 ECMAScript 语法、JS 的新语法糖等)
- 这个特性将与 TypeScript's Design Goals 的其他部分保持一致。
📃 激励示例
import foo from 'foo';
const bar = foo(); // foo returns any
acceptsStringOnly( arg ); // no error reported, since "any" is allowed for string, but when running the code in browser, this will give an error, that tsc could easily catch, if it were "unknown" instead of "any"
if ( arg === false ) {
// arg is still type "any", because type guard doesn't work on "any"
}
💻 用例
更严格的类型检查,以避免在使用第三方代码/任何返回值时出现错误弹出的情况,其中该值用于具有更严格要求的函数中。
如果你查看错误数据(例如 sentry),你会发现这是用户浏览器报告的最常见错误,因为 "any" 是类型系统的逃生舱口,使得在某些情况下在 typescript 中进行类型验证变得无用 - 这就是为什么 useUnknownInCatchVariables
已经实现的原因。
3条答案
按热度按时间e37o9pze1#
See #24737
cnh2zyt32#
我不确定一旦我们忽略了如上所述的 #24737 中的约束条件,这个功能的实际效用会是什么。我们可以提供一个选项来改变未注解的
(x) => void
,使其意味着(x: unknown) => void
,但这似乎不会持续很长时间,而且还会创造一个巨大的意外语法陷阱,即不小心写出(string) => void
意味着(string: unknown) => void
,这在声明位置尤其危险。tpgth1q73#
如果我理解正确的话,这个问题只涉及到传递给函数的参数。然而,useUnknownForAnyReturn 只适用于函数返回的内容,而 useUnknownForAnyParamCallback 只适用于函数内部的内容。现有的
useUnknownInCatchVariables
与提议的useUnknownForAnyParamCallback
完全相同,只是它只适用于catch
函数内部(虽然严格来说不是一个技术上的函数,但在未知应用的方面,它们是相同的),而不是所有类型的所有回调函数。因此,这似乎并不太牵强附会,对吗?