eslint-plugin-unicorn 规则解析:no-duplicate-set-values —— 拦截 `Set` 构造器数组字面量中的重复值
eslint-plugin-unicorn 规则解析no-duplicate-set-values —— 拦截Set构造器数组字面量中的重复值【免费下载链接】eslint-plugin-unicornMore than 300 powerful ESLint rules项目地址: https://gitcode.com/GitHub_Trending/es/eslint-plugin-unicorn本篇技术指南聚焦 eslint-plugin-unicorn 中的no-duplicate-set-values规则讲解它为何存在、如何判定重复、覆盖哪些边界情况、又刻意放过哪些场景并结合规则源码、共享工具函数与测试用例帮助你彻底理解这一建议型规则的判定模型避免写出冗余的Set初始化代码。规则定位冗余即噪声重复值在Set中毫无意义Set的特性是成员唯一基于 SameValueZero 语义去重因此向new Set([...])传入的静态数组字面量中出现重复值是纯粹的多余代码——运行结果不变却增加阅读与维护成本。该规则正是为此而生其完整描述见 docs/rules/no-duplicate-set-values.md。规则默认开启于 ✅recommended配置在 ☑️unopinionated配置中则处于关闭状态见 readme.md 规则清单中该行标记。规则的 meta 配置为type: suggestion、recommended: true仅支持js/js语言见 rules/no-duplicate-set-values.js。判定范围只盯new Set([...])数组字面量规则入口在 rules/no-duplicate-set-values.js 的NewExpression监听器中判定链路非常严格必须是new Set(...)且恰好一个参数通过isNewExpression辅助函数校验name: Set、argumentsLength: 1该参数的类型必须是ArrayExpression数组字面量对数组元素调用共享工具getDuplicateArrayElements找出重复项并逐一上报。因此以下写法一律不被检查没有new的Set([1, 1])非Set名称的new NotSet([1, 1])限定名new globalThis.Set([1, 1])源码只匹配裸标识符Set非数组字面量参数如new Set(foo)、new Set(iterable)数组[...]、Map、其他可迭代对象链式set.add(1).add(1)调用。这些排除项都在规则源码iterable.type ! ArrayExpression的提前返回以及测试用例new Set(foo)、Set([1, 1])、new NotSet([1, 1])、new globalThis.Set([1, 1])中得到印证见 test/no-duplicate-set-values.js。重复判定模型静态值比较 引用比较双通道重复检测的核心实现在共享工具 rules/utils/get-duplicate-array-elements.js。对每个元素规则先尝试提取无副作用的静态值无法提取时退化为引用比较两条通道互为补充静态值通道通过getStaticValueIfNoSideEffects见 rules/utils/get-static-value.js求值仅当结果是可比较的原始值null、string、number、boolean、bigint、undefined等即isComparableStaticValue过滤掉object与function时才参与比较引用通道当两侧都没有可比较静态值时使用isSameReference见 rules/utils/is-same-reference.js判断两个表达式是否指向同一处引用。静态值的比较采用SameValueZero语义与Set内部去重语义一致判等但两个NaN视为相等。这一语义由工具函数isSameValueZero显式实现。示例一字面量重复// ❌ 报错Remove duplicate value foo from the Set. const set new Set([ foo, bar, foo, ]); // ✅ const set new Set([ foo, bar, ]);示例二常量变量与静态表达式可被求值// ❌ foo 的静态值就是 2 const foo 2; const set new Set([foo, 2]); // ✅ const foo 2; const set new Set([foo, 3]);测试中还覆盖了二元表达式new Set([1 1, 2])、模板字符串与普通字符串new Set([foo, foo])、常量绑定const foo bar; new Set([foo, bar])等静态求值场景均被判为重复。示例三引用表达式重复// ❌ 两个 foo.bar 是同一引用 const set new Set([foo.bar, foo.bar]); // ✅ const set new Set([foo.bar, foo.baz]);引用通道还支持成员表达式的等价形式例如new Set([foo[bar], foo.bar])点号与方括号写法等价、new Set([this.foo, this.foo])都会被识别见测试用例。其实现细节在 rules/utils/is-same-reference.js能解析出静态属性名时比较属性名与对象引用否则比较computed标记、对象引用与属性引用。值得注意的数值边界NaN与0/-0因为静态值比较使用 SameValueZero以下两组在下结果不同的写法也会被正确标记// ❌ Set 内部会去重 NaN故视为重复 new Set([NaN, NaN]); // ❌ Set 内部 0 与 -0 相等 new Set([0, -0]);对应的测试用例new Set([NaN, NaN])、new Set([0, -0])均位于 invalid 列表验证了规则与Set运行时语义的一致性。刻意放过的场景副作用、对象字面量与展开符规则文档明确声明不建模元素之间的副作用或变更从测试用例可以清晰看到边界设计函数调用new Set([foo(), foo()])合法——两次调用可能有副作用结果未必相同对象/数组/正则字面量new Set([{}, {}])、new Set([[], []])、new Set([/foo/, /foo/])、new Set([Symbol(), Symbol()])均合法——它们不是可比较的原始静态值也不是同一引用可能被 getter 变更的成员访问测试用例用Object.defineProperty给object.value挂上 getter 后new Set([object.value, 1])被判定为合法这正是getStaticValueIfNoSideEffects对潜在可变成员访问与副作用求值进行防御的结果见 rules/utils/get-static-value.js 中hasPotentiallyMutableMemberAccess与副作用检查逻辑展开元素getDuplicateArrayElements对SpreadElement直接continue跳过因此new Set([foo, ...bar, baz])合法但展开前后的普通元素仍参与比较new Set([foo, ...bar, foo])会被标记为重复两个foo位于展开两侧静态比较与引用比较不受展开元素影响。数组空洞elision也被视为重复数组字面量中的空洞位在getDuplicateArrayElements中被统一当作undefined处理new Set([, undefined])、new Set([undefined, ,])、new Set([,,])均为 invalid 用例。上报时若元素本身缺失hole规则会退而报告整个iterable节点并输出值为undefined的占位文本——对应源码中element ?? iterable与element ? sourceCode.getText(element) : undefined的两处兜底。上报信息与自动修复命中后规则输出唯一消息 IDno-duplicate-set-values文案为Remove duplicate value{{value}}from the Set.其中{{value}}取自重复元素的源码文本如foo、foo.bar。需要说明的是从 rules/no-duplicate-set-values.js 的create实现看该规则不提供fix函数属于仅报告、不自动修复的suggestion类型规则——重复值由谁保留、删除哪个需要开发者结合语义自行决定。测试覆盖与回归保障规则的完整行为由 test/no-duplicate-set-values.js 的快照测试锁定invalid 列表覆盖了字面量重复数字、字符串、null、undefined、负号字面量-1、SameValueZero 边界NaN、0/-0、多重重复[1, 1, 2, 2]、静态求值1 1、模板字符串、常量变量、引用重复标识符、成员表达式、计算属性、this成员、空洞位、跨展开元素重复以及const foo {}; new Set([foo, foo])这类纯对象引用重复。valid 列表则覆盖了类型严格区分new Set([1, 2, 1])合法数字与字符串不等价、副作用调用、getter 防御、对象字面量等放行场景。若希望在你的项目中启用该规则可在 ESLint flat config 中引入 eslint-plugin-unicorn 的recommended配置默认开启或在自定义规则项中显式配置export default [ // ... { rules: { unicorn/no-duplicate-set-values: error, }, }, ];小结no-duplicate-set-values是一个小而精准的建议型规则它只审查new Set([...])数组字面量用无副作用静态值SameValueZero 引用等价的双通道模型识别冗余元素同时严谨地回避函数调用、getter、对象字面量与展开元素等不确定场景。理解它的判定边界既能放心开启该规则也能在遇到误报时准确判断是否属于规则刻意放行的合法情况。【免费下载链接】eslint-plugin-unicornMore than 300 powerful ESLint rules项目地址: https://gitcode.com/GitHub_Trending/es/eslint-plugin-unicorn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ROMA-DSPy BinanceToolkit 实战指南:类型安全的加密货币市场数据工具包

ROMA-DSPy BinanceToolkit 实战指南:类型安全的加密货币市场数据工具包

ROMA-DSPy BinanceToolkit 实战指南:类型安全的加密货币市场数据工具包 【免费下载链接】ROMA Recursive-Open-Meta-Agent v0.1 (Beta). A meta-agent framework to build high-performance multi-agent systems. 项目地址: https://gitcode.com/GitHub_Trending/…

2026/9/18 13:43:59 阅读更多 →
UE4载具性能调优实战:物理参数、碰撞检测与Tick优化指南

UE4载具性能调优实战:物理参数、碰撞检测与Tick优化指南

1. 载具系统性能问题的典型症状与诊断思路做UE4载具调优这些年,我踩过最大的一个坑就是:把性能问题当成参数问题来治。刚入行那会儿,项目里一辆坦克在复杂地形上跑起来帧率从90掉到35,我第一反应是去翻VehicleMovementComponent的…

2026/9/19 16:20:17 阅读更多 →
基于零知识证明的DID自主主权身份认证架构与实践

基于零知识证明的DID自主主权身份认证架构与实践

简介:《自主主权身份认证体系:基于零知识证明的区块链DID系统架构设计》是一份33页的技术文档,聚焦去中心化数字身份与隐私保护认证方案,适合区块链开发者、架构师及安全研究人员阅读。文档以自主主权身份(SSI&#xf…

2026/9/19 17:12:12 阅读更多 →

最新新闻

Meteor 私有资源目录 private/ 与 Assets API 完全指南:服务端安全访问私有数据文件

Meteor 私有资源目录 private/ 与 Assets API 完全指南:服务端安全访问私有数据文件

后端前端开发工具移动开发 【免费下载链接】meteor Meteor, the JavaScript App Platform 项目地址: https://gitcode.com/gh_mirrors/me/meteor 点击查看 免费下载 private/ 是 Meteor 应用顶层目录中一个特殊的存在:目录内所有文件只能由服务端代码访…

2026/9/19 17:14:44 阅读更多 →
MMDetection 集成 X-Decoder 实战指南:统一像素/图像/语言解码的开放词汇分割与视觉语言推理

MMDetection 集成 X-Decoder 实战指南:统一像素/图像/语言解码的开放词汇分割与视觉语言推理

MMDetection 集成 X-Decoder 实战指南:统一像素/图像/语言解码的开放词汇分割与视觉语言推理 【免费下载链接】mmdetection OpenMMLab Detection Toolbox and Benchmark 项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection 导读 本文围绕 MMDetectio…

2026/9/19 17:14:44 阅读更多 →
uniapp对接RFID硬件:原生插件封装与盘存优化实战

uniapp对接RFID硬件:原生插件封装与盘存优化实战

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

2026/9/19 17:14:44 阅读更多 →
YOLOv11架构升级与部署实践:从C3k2到C2PSA的完整指南

YOLOv11架构升级与部署实践:从C3k2到C2PSA的完整指南

YOLOv11发布已经有一段时间了,ultralytics团队这次把整个训练、推理、验证、导出的链路又打磨了一遍。如果你和我一样,之前一直用YOLOv8跑业务,第一次切到v11大概率会有这种感觉:API几乎没变,但很多默认行为和网络细节…

2026/9/19 17:14:44 阅读更多 →
汽车企业数智化战略规划:从业务架构到数据平台落地

汽车企业数智化战略规划:从业务架构到数据平台落地

简介:这份汽车企业数智化战略规划PPT,面向汽车企业战略管理者、数字化转型负责人与咨询顾问,聚焦传统汽车产业在互联网时代的转型升级。资源为一个pptx文件,约二十二点六八MB,共一百四十五页。方案围绕“互联网1354”顶…

2026/9/19 17:14:44 阅读更多 →
Hugo Page.ReadingTime 方法详解:估算阅读时间的计算原理与多语言定制

Hugo Page.ReadingTime 方法详解:估算阅读时间的计算原理与多语言定制

Hugo Page.ReadingTime 方法详解:估算阅读时间的计算原理与多语言定制 【免费下载链接】hugo The world’s fastest framework for building websites. 项目地址: https://gitcode.com/gh_mirrors/hu/hugo 导读 Page.ReadingTime 是 Hugo 模板中用于估算页面…

2026/9/19 17:13:44 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →