typescript-eslint 出现 "property is deprecated on nodes" 警告怎么排查?
【免费下载链接】typescript-eslint:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript项目地址: https://gitcode.com/GitHub_Trending/ty/typescript-eslint
运行 ESLint 时,如果项目使用 typescript-eslint 作为 TypeScript 解析器,终端里可能会出现这样的 Node.js 警告:
The 'typeParameters' property is deprecated on TSCallSignatureDeclaration nodes. Use 'typeArguments' instead. See https://tseslint.com/key-property-deprecated.这里的<key>(如typeParameters)、<type>(节点类型)和替换属性名会随触发场景变化。出现这个警告通常意味着:你装的某个 ESLint 插件(或其他处理 AST 的工具)还没有适配 typescript-eslint v6,它仍在读取已被弃用的 AST 属性名。下面按官方 FAQ(docs/troubleshooting/faqs/General.mdx)给出的路径逐步排查。
这个警告是怎么产生的
typescript-eslint v6 对部分 AST 属性做了改名:原来叫parameters的属性,实际含义是arguments,于是被改名为typeArguments。官方对术语的解释是:argument是你主动提供给接收方的东西(例如调用表达式中显式传入的类型),parameter是接收方用来接收它的声明(例如函数声明的泛型参数)(见 v6 发布公告 packages/website/blog/2023-07-09-announcing-typescript-eslint-v6.md 中 "AST Breaking Changes" 一节)。
为了保证兼容性,旧属性名并没有被删除,而是在解析器里以"弃用别名 getter"的形式保留。当你看到警告时,其实是有人在读取这个别名。在解析器源码 convert.ts 中可以看到:
- 读取弃用别名时会通过
process.emitWarning(..., 'DeprecationWarning')发出警告,消息模板就是The '<key>' property is deprecated on <type> nodes. Use '<newKey>' instead.; - 同一个节点上的同一属性只警告一次(源码中的
warned标志位),所以一次 lint 中同一位置不会刷屏; - 解析器还提供
suppressDeprecatedPropertyWarnings选项(见 parser-options.ts),开启后别名仍可读取但不再告警——这属于"治标"手段,后面会说明适用条件。
关键点:警告不是你自己的配置问题,而是某个消费者在读取旧属性名。排查目标就是找到这个消费者。
排查步骤
第一步:把所有 ESLint 插件升级到最新版本
FAQ 给出的第一判断是:如果你看到这个警告,"likely you're using an ESLint plugin (or other tooling) that hasn't been updated for typescript-eslint v6"。先把eslint-plugin-*等相关依赖都升到最新版,再重新跑一次 lint。很多情况下插件新版已经改用typeArguments,警告自然消失。
第二步:不确定是哪个插件发出时,用两种方法定位
如果插件很多、都升到最新后仍有警告(或者你无法确认已覆盖所有插件),FAQ 给出两种手段,可单独使用也可组合:
用
--trace-deprecation跑一次 lint。这是 Node.js 的 CLI 选项,会给弃用警告附带调用堆栈,从而看到是哪个插件的代码在读取该属性。FAQ 中给出的示例命令(npm run lint请替换成你项目里实际的 lint 脚本名):npx cross-env NODE_OPTIONS=--trace-deprecation npm run lint该命令只是额外带参数运行一次 lint 脚本,不会修改文件。观察输出中的堆栈,定位到具体的
eslint-plugin-*包。逐批禁用插件缩小范围。一次把一半插件从配置中禁用(或临时移除),看警告是否消失,据此二分法逐步收敛到出问题的插件。
注意第二种方式只改动你的 ESLint 配置,排查结束后记得恢复;排查期间 lint 结果会不完整,不要在禁用状态下依据结果改代码。
第三步:对定位到的插件跟进 v6 适配
FAQ 的建议是:确认该插件是否已有要求其"发布支持 typescript-eslint v6 版本"的 issue;如果还没有,去提一个。在插件发布新版之前,这个警告属于已知的外部依赖问题。
如果警告来自你自己写的规则
如果你自己开发 ESLint 插件/规则,且规则还需要同时兼容 typescript-eslint v5 和 v6,FAQ 给出的做法是回退读取旧属性名:
- node.typeParameters + node.typeArguments || node.typeParameters优先读新属性typeArguments,不存在时再回退到旧名typeParameters。这样规则在 v6 下不会触发警告,在 v5 下也不会取到undefined。
可选:临时抑制警告
如果定位到警告来源是暂时无法更新的第三方工具,又想让输出干净一些,可以在解析器选项中开启suppressDeprecatedPropertyWarnings(解析器选项定义见 parser-options.ts)。开启后旧属性名仍可正常读取,只是不再打印警告。
适用条件:只在警告来源已明确、且你确认其读取的是兼容别名而不是真 bug 的情况下使用。不要用它掩盖还没定位的来源——那样会失去唯一的外显信号。
验证修复是否生效
- 升级插件后重新完整跑一次 lint,警告不再出现即为修复成功;
- 若曾开启
suppressDeprecatedPropertyWarnings,临时关掉它再跑一次:如果警告仍不出现,说明确实是某个插件在 v6 下不再读取旧属性;如果警告又出现,说明还有插件没有适配完,回到第二步继续定位。
这个警告本身不影响 lint 结论(别名返回的是正确值),但它是一个明确的升级信号:警告里点名的属性名和节点类型,正是当前还有工具停留在 typescript-eslint v5 AST 结构的证据。按上面的顺序走一遍——升插件、trace 定位、跟进 issue——通常就能闭环。
【免费下载链接】typescript-eslint:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript项目地址: https://gitcode.com/GitHub_Trending/ty/typescript-eslint
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考