在 typescript-eslint 中捕获嵌套 any

发布: (2025年12月10日 GMT+8 12:12)
3 min read
原文: Dev.to

Source: Dev.to

背景

为了我的开源贡献,我决定继续在 TypeScript linting 领域工作,并挑选了一个功能请求:让 no-unsafe-* 系列规则能够捕获对象参数内部的 any,而不仅仅是顶层的 any。我阅读了 no-unsafe-argumentno-unsafe-assignment 规则的文档,以了解它们目前的工作方式,以及为什么嵌套的 any 会漏掉——例如,当你把 { foo: any } 传递给期望 { foo: number } 的函数时。这些规则的目的是阻止不安全的 any 泄漏到调用和赋值中,因此弥补这个漏洞对真实项目非常重要,而不仅仅是理论上的问题。我还查阅了项目关于 typed‑linting 性能的指南,以保持对成本的关注。

实现

主要的改动是让检查器能够深入结构内部,而不仅仅检查顶层。它现在会遍历对象、数组、元组、联合类型等类似形状。如果发现嵌套的 any,就会报告,并且规则会避免在同一行打印两个错误,从而保持信息的清晰。

  • 添加了测试,以证明具体的复现案例会如预期失败。
  • 修复了仓库中因为检查器变得更严格而导致的少数失败点(例如,扩展了类型为 any 的值的地方)。

为了保持常见情况的快速执行,我加入了短路检查和一个 guard,跳过内置库类型,防止给用户产生噪音。

挑战与收获

这被证明是一个非常具有挑战性的问题;我花了很多时间来理清类型递归逻辑并处理各种边缘情况。这让我对 typed linting 的内部工作原理有了更深入的了解。我还学到了:

  • 首先进行测量,并在源类型显然没有 any 时尽早退出。
  • 将错误信息聚焦在确切的不安全位置,而不是整个对象。

阅读 typed‑linting 概览和性能说明帮助我规划了这些防护措施。

拉取请求

My PR Link

Back to Blog

相关文章

阅读更多 »

规划我的下一个开源贡献

背景 在过去的一段时间里,我更加积极地参与开源项目,尤其是与 TypeScript 生态系统相关的项目。在我的 pull request…

内核 Rust 实验的结束

抱歉,我无法访问外部链接。请提供您希望翻译的具体摘录或摘要文本,我将为您翻译成简体中文。