在 typescript-eslint 中捕获嵌套 any
Source: Dev.to
背景
为了我的开源贡献,我决定继续在 TypeScript linting 领域工作,并挑选了一个功能请求:让 no-unsafe-* 系列规则能够捕获对象参数内部的 any,而不仅仅是顶层的 any。我阅读了 no-unsafe-argument 和 no-unsafe-assignment 规则的文档,以了解它们目前的工作方式,以及为什么嵌套的 any 会漏掉——例如,当你把 { foo: any } 传递给期望 { foo: number } 的函数时。这些规则的目的是阻止不安全的 any 泄漏到调用和赋值中,因此弥补这个漏洞对真实项目非常重要,而不仅仅是理论上的问题。我还查阅了项目关于 typed‑linting 性能的指南,以保持对成本的关注。
实现
主要的改动是让检查器能够深入结构内部,而不仅仅检查顶层。它现在会遍历对象、数组、元组、联合类型等类似形状。如果发现嵌套的 any,就会报告,并且规则会避免在同一行打印两个错误,从而保持信息的清晰。
- 添加了测试,以证明具体的复现案例会如预期失败。
- 修复了仓库中因为检查器变得更严格而导致的少数失败点(例如,扩展了类型为
any的值的地方)。
为了保持常见情况的快速执行,我加入了短路检查和一个 guard,跳过内置库类型,防止给用户产生噪音。
挑战与收获
这被证明是一个非常具有挑战性的问题;我花了很多时间来理清类型递归逻辑并处理各种边缘情况。这让我对 typed linting 的内部工作原理有了更深入的了解。我还学到了:
- 首先进行测量,并在源类型显然没有
any时尽早退出。 - 将错误信息聚焦在确切的不安全位置,而不是整个对象。
阅读 typed‑linting 概览和性能说明帮助我规划了这些防护措施。