ESLint no-useless-constructor 规则完全解析:识别并移除冗余类构造函数
ESLint no-useless-constructor 规则完全解析识别并移除冗余类构造函数【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslintno-useless-constructor是 ESLint 内置的一条 suggestion 类型规则用于标记那些删掉后类行为完全不变的多余构造函数——包括空构造函数以及仅把参数原样透传给父类的构造函数。本文以本仓库ESLint 主仓库为基准先梳理规则的使用方法与正反示例再深入 lib/rules/no-useless-constructor.js 的源码实现讲清它如何判定无用、如何处理 TypeScript 语法、以及它提供的自动修复建议最后给出禁用策略。读完本文你将能准确预判该规则的报错边界并理解其建议修复suggestion的实现细节。规则背景ES2015 的默认构造函数ES2015 为类提供了默认构造函数如果没有显式指定引擎会基于类的声明自动生成一个构造函数。对于基类默认构造函数等价于一个空构造函数对于派生类extends的类默认构造函数则等价于把收到的所有参数原样传给super()。正因如此下面这类手写的构造函数与默认行为完全等价属于冗余代码class A { constructor () { } } class B extends A { constructor (value) { super(value); } }no-useless-constructor的作用就是把这类可以安全删除的构造函数标记出来帮助开发者写出更精简的类定义。Rule Details什么算无用构造函数规则定义在 lib/rules/no-useless-constructor.js元信息位于该文件meta段第 165 行起规则类型为suggestion附带一条removeConstructor删除构造函数的修复建议且schema: []无任何可配置选项。从源码入口看规则监听MethodDefinition节点第 258-260 行对每个kind 为 constructor的方法定义调用checkForConstructor进行判定。它覆盖两类场景基类无superClass的空构造函数构造函数体语句数为 0即constructor() {}派生类中仅透传参数的构造函数构造函数体只有一条super(...)语句且参数与super实参一一对应详见下文源码实现小节。错误的代码示例会被报错/*eslint no-useless-constructor: error*/ class A { constructor () { } } class B extends A { constructor (...args) { super(...args); } }正确的代码示例不会报错/*eslint no-useless-constructor: error*/ class A { } class B { constructor () { doSomething(); } } class C extends A { constructor() { super(foo); } } class D extends A { constructor() { super(); doSomething(); } }注意其中几个关键区别class A { }不写构造函数自然没有问题class B的构造函数内调用了doSomething()有实际逻辑不视为无用class C调用super(foo)传入了固定实参而构造函数本身没有参数两者不对应删除后会改变父类收到的参数因此不报错class D在super()之后还有额外语句删除会丢失逻辑不报错。该行为在 tests/lib/rules/no-useless-constructor.js 的有效用例valid数组中有大量对应印证例如class A extends B { constructor(){ super(foo); } }—— 传入固定值合法class A extends B { constructor(foo, bar){ super(foo, bar, 1); } }—— 实参多于形参合法class A extends B { constructor(a f()) { super(...arguments); } }—— 存在默认参数合法class A extends B { constructor(){ super(); doSomething(); } }——super()后有额外逻辑合法。TypeScript 支持访问修饰符与装饰器参数该规则额外支持 TypeScript 语法。在判定时会调用hasUsefulAccessibility(node)与hasDecoratorsOrParameterProperty(node)两个辅助函数lib/rules/no-useless-constructor.js进行豁免构造函数的访问修饰符accessibility为protected或private时不算无用因为删除它会改变类的可访问性设计例如private constructor()常用于阻止外部实例化修饰符为public时仅当类没有父类时才可能被判定为无用若存在父类public constructor被保留构造函数参数带有装饰器或属于参数属性TSParameterProperty如constructor(private name: string)时不算无用因为删除构造函数会丢失装饰器初始化或参数属性声明。错误的 TypeScript 代码示例/* eslint no-useless-constructor: error */ class A { public constructor() {} }正确的 TypeScript 代码示例/* eslint no-useless-constructor: error */ class A { protected constructor() {} } class B extends A { public constructor() { super(); } } class C { constructor(decorated param) {} }测试文件 tests/lib/rules/no-useless-constructor.js 中独立的ruleTesterTypeScript区块使用typescript-eslint/parser验证了这些边界例如private constructor() {}、constructor(private name: string) {}、constructor(Foo foo) {}均为合法代码而public constructor() {}无父类则会被报错并给出删除建议。Options本规则没有配置项no-useless-constructor没有任何可配置选项源码中schema: []。你只能通过规则的开关来控制它{ rules: { no-useless-constructor: error } }或使用warn级别在集成到 CI 前先观察告警。它不属于eslint:recommended预设源码meta.docs.recommended为false需要显式开启。源码实现如何判定一个构造函数无用基类的空构造函数对没有父类的类node.parent.parent.superClass为空只要构造函数体语句数为 0 即命中lib/rules/no-useless-constructor.jssuperClass ? isRedundantSuperCall(body, ctorParams) : body.length 0派生类的透传构造函数对派生类需要构造函数体是单一super()调用且参数与实参严格对应。isRedundantSuperCall的判定链路第 47-158 行值得细读isSingleSuperCall(body)构造函数体必须只有一条语句且是CallExpression、其callee为SuperctorParams.every(isSimple)所有形参必须是Identifier或RestElement——默认参数、解构参数可能带副作用不能安全透传因此被排除满足下面任一条件即视为冗余isSpreadArguments(...)调用super(...arguments)把所有参数原样透传isPassingThrough(ctorParams, superArgs)形参与super()实参数量相同且逐位配对配对方式有两种isValidIdentifierPair同名标识符如constructor(foo){ super(foo); }isValidRestSpreadPair形参...rest与实参...rest配对如constructor(...args){ super(...args); }。一旦参数顺序错位、数量不等、传固定值或改名配对失败构造函数即被视为有用。测试中的无效用例清晰覆盖了这些命中场景例如class A extends B { constructor(foo, bar){ super(foo, bar); } }、class A extends B.C { constructor() { super(...arguments); } }、class A extends B { constructor(a, b, ...c) { super(a, b, ...c); } }。建议修复suggestion的细节规则附带一条removeConstructor建议用空字符串替换整个构造函数节点lib/rules/no-useless-constructor.js。替换并非简单删除——如果删除后与类体中的下一个成员合并会产生语法歧义它会自动补一个分号const addSemiColon astUtils.canContinueExpressionInClassBody(nextToken) astUtils.needsPrecedingSemicolon(sourceCode, node);其中canContinueExpressionInClassBody判断下一个 token 是否为[、*、in、instanceof这类会延续上一个表达式的 token见 lib/rules/utils/ast-utils.jsneedsPrecedingSemicolon进一步按 ASI自动分号插入规则判断是否需要分号隔离。测试中对此有专门验证例如class A { foo bar constructor() { } [0]() { } }删除构造函数后建议输出为在字段与方法之间插入;class A { foo bar ; [0]() { } }同理*baz() {}、in、instanceof等后续成员也会触发补分号逻辑而当后续成员是私有字段#instanceof等不会产生歧义的 token 时则直接删除并保留空行。测试文件第 232-520 行集中验证了这批边界场景。需要说明的是作为 suggestion开发者需要显式应用修复如在编辑器中使用快速修复或在--fix-type suggestion模式下处理规则本身不会在纯--fix中自动改写代码。何时不使用此规则When Not To Use It如果你不想被提醒存在多余的构造函数可以放心地关闭此规则{ rules: { no-useless-constructor: off } }典型场景包括团队约定显式书写构造函数以表达意图例如配合文档注释、装饰器或未来扩展点或项目大量使用 TypeScript 参数属性/私有构造函数等本规则豁免之外的边界用法此时关闭该规则可以避免噪音。实践小结判定核心基类看构造函数体是否为空派生类看是否单一super()调用 形参实参逐位对应或...arguments透传TypeScript 特殊处理private/protected构造函数、带装饰器或参数属性的构造函数不会被标记无配置项只能开关不能调参且不属于eslint:recommended建议修复提供removeConstructorsuggestion并在类体后续成员如[、*、in、instanceof可能造成歧义时自动补分号保证删除后语法仍然成立。如需进一步研究可继续阅读本仓库中的 规则实现、规则注册入口、完整测试用例 以及 AST 工具函数测试文件中的valid/invalid用例是最直观的规则行为规范文档。【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Envoy 上游多证书支持:custom_tls_certificate_selector 与 max_session_keys=0 解锁客户端 TLS 多证书

Envoy 上游多证书支持:custom_tls_certificate_selector 与 max_session_keys=0 解锁客户端 TLS 多证书

Envoy 上游多证书支持:custom_tls_certificate_selector 与 max_session_keys0 解锁客户端 TLS 多证书 【免费下载链接】envoy Cloud-native high-performance edge/middle/service proxy 项目地址: https://gitcode.com/GitHub_Trending/en/envoy 本篇文章聚…

2026/10/27 11:52:34 阅读更多 →
使用 k6 与 xk6-loki 对 Loki 日志查询(读路径)进行压测的完整指南

使用 k6 与 xk6-loki 对 Loki 日志查询(读路径)进行压测的完整指南

使用 k6 与 xk6-loki 对 Loki 日志查询(读路径)进行压测的完整指南 【免费下载链接】loki Like Prometheus, but for logs. 项目地址: https://gitcode.com/GitHub_Trending/lok/loki 本篇技术指南围绕 Loki 读路径(查询)的…

2026/10/27 11:52:34 阅读更多 →
MT管理器:安卓文件管理神器,APK编辑与局域网传输实战详解

MT管理器:安卓文件管理神器,APK编辑与局域网传输实战详解

我用安卓手机这么多年,折腾过不少花样,最离不开的其实就是一两个趁手的工具。今天想聊的这款文件管理工具,圈内人称“MT管理器”,在玩机党眼里它早就是标配了,但如果你只是把它当成一个普通的“看文件”App&#xff0c…

2026/10/27 12:33:05 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/28 7:28:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/28 9:02:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/28 9:00:54 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/28 7:29:02 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 9:01:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →