尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Biome 修复 `useNamingConvention` 误报:`declare global` 与外部模块中的 `namespace` 不再被重命名
Biome 修复useNamingConvention误报declare global与外部模块中的namespace不再被重命名【免费下载链接】biomeA toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.项目地址: https://gitcode.com/gh_mirrors/bi/biome本文以 Biome 仓库中的 changeset 变更记录.changeset/naming-convention-ambient-namespaces.md为核心剖析useNamingConvention规则针对 TypeScript ambient 声明的行为修复此前biome check --write会错误地重命名declare global或外部模块声明内的namespace本次修复使其不再报告这类声明。读者阅读后可理解该规则的忽略机制、底层作用域判定实现以及对应的测试用例并掌握升级后的正确行为。变更概览一个 patch 级别的行为修复该 changeset 声明了对biomejs/biome的patch补丁级变更修复了 GitHub issue #11566 对应的问题useNamingConvention不再报告在declare global内部或外部模块声明external module declaration内部声明的namespace。changeset 原文给出的触发场景如下export {} declare global { // no longer renamed to Jsx namespace JSX {} }修复前useNamingConvention会对namespace JSX报告诊断并且由于该规则附带安全修复safe fix运行biome check --write会将其自动重命名为Jsx修复后这类声明被完整跳过不再产生任何诊断或自动改写。规则背景useNamingConvention为何会管到 namespaceuseNamingConvention是 Biome 的 lint 规则用于强制整个代码库遵循命名约定Enforce naming conventions for everything across a codebase声明于 crates/biome_js_analyze/src/lint/style/use_naming_convention.rs。它按声明种类Kind施加默认约定其中与本次修复直接相关的是类、枚举、接口、类型别名、类型参数 →PascalCase变量 /const/var/let→camelCase或PascalCase全局const/var额外允许CONSTANT_CASE函数、export namespace、import namespace、namespace、namespace类成员、函数参数 →camelCase或PascalCase默认约定映射见 use_naming_convention.rsKind::Namespace等被映射为Case::Camel | Case::Pascal。这正是namespace JSX会被报告的原因——JSX是全大写的缩写形式既不是camelCase也不是PascalCase在默认strictCase: true下连续大写字符不被允许因而命中诊断并被建议改名为Jsx。然而规则文档中本就声明了若干**总是被忽略always ignored**的声明位置见 use_naming_convention.rs其中包括不是标识符的成员名如计算属性名具名导入named imports解构对象属性标记了override的类成员外部 TypeScript 模块内部的声明declare module myExternalModule { export interface my_INTERFACE {} }全局声明declare global内部的声明declare global { interface HTMLElement {} }本次 changeset 修复的实质就是让namespace声明在这两个应被忽略的位置上真正生效与文档声明的行为对齐并消除了原本不必要的自动重命名。源码实现scope_from_declaration如何跳过 ambient 声明修复的核心位于use_naming_convention.rs中的作用域判定辅助函数scope_from_declarationuse_naming_convention.rs/// Returns the scope of node or None if the scope cannot be determined or /// if the scope is an external module. fn scope_from_declaration(node: AnyJsBindingDeclaration) - OptionScope { let control_flow_root node.syntax().ancestors().skip(1).find(|x| { AnyJsControlFlowRoot::can_cast(x.kind()) || x.kind() JsSyntaxKind::TS_DECLARATION_MODULE || x.kind() JsSyntaxKind::TS_EXTERNAL_MODULE_DECLARATION || x.kind() JsSyntaxKind::TS_GLOBAL_DECLARATION })?; match control_flow_root.kind() { JsSyntaxKind::JS_MODULE | JsSyntaxKind::JS_SCRIPT | JsSyntaxKind::TS_DECLARATION_MODULE | JsSyntaxKind::TS_MODULE_DECLARATION Some(Scope::Global), // Ignore declarations in external module declaration and global declarations. JsSyntaxKind::TS_EXTERNAL_MODULE_DECLARATION | JsSyntaxKind::TS_GLOBAL_DECLARATION None, _ Some(Scope::Any), } }其工作方式可以拆解为三步向上查找控制流根节点从声明节点沿语法树向上跳过自身寻找最近的控制流根或三类特殊的 TypeScript 声明节点——TS_DECLARATION_MODULEdeclare module、TS_EXTERNAL_MODULE_DECLARATION外部模块声明、TS_GLOBAL_DECLARATIONdeclare global。判定作用域若根节点是普通模块JS_MODULE、脚本JS_SCRIPT或declare module/命名空间模块声明则返回Scope::Global若根节点是TS_EXTERNAL_MODULE_DECLARATION或TS_GLOBAL_DECLARATION则返回None。None即跳过调用方使用?运算符如 use_naming_convention.rs 中scope_from_declaration(decl)?的写法一旦返回None该声明就不会生成选择器Selector自然也不会产生任何诊断与修复动作。值得注意的是JS_MODULE、JS_SCRIPT、TS_DECLARATION_MODULE、TS_MODULE_DECLARATION返回Scope::Global意味着位于这些作用域中的全局变量仍会被正常检查Scope枚举本身定义于 biome_rule_options/src/use_naming_convention.rs用于支持selector.scope配置只有declare global与外部模块声明这两个 ambient 位置被明确排除。从实现上看这正是本次 changeset 所描述修复的落地位置。测试用例验证spec 测试锁定的行为Biome 为本次修复补充了对应的 spec 测试位于 crates/biome_js_analyze/tests/specs/style/useNamingConvention/validGlobalNamespace.ts与 changeset 示例完全一致断言不应产生诊断/* should not generate diagnostics */export {} declare global { namespace JSX {} }validExternalModule.tsdeclare module myExternalModule { ... }内的声明不应产生诊断。validExternalModuleNamespace.ts外部模块内部的 namespace 声明同样被忽略。validInterfaceOverload.tsdeclare global内的接口重载不被报告。这些用例的输入文件与.snap快照如validGlobalNamespace.ts.snap一一对应任何回归例如再次对namespace JSX报告或给出重命名建议都会导致 spec 测试失败从而从测试层面锁定了该修复行为。对用户的影响与升级建议如果你此前在项目中依赖useNamingConvention并在declare global/ 外部模块声明中放置了namespace例如常见的declare global { namespace JSX {} }写法用于为 JSX 命名空间补充类型升级前biome check会报告这些namespace名称不符合camelCase/PascalCasebiome check --write还会执行安全修复将其重命名为Jsx之类的名称导致无谓的源码改动甚至可能影响与第三方类型声明的匹配。升级后包含该 patch 的版本这些声明被完全忽略不再产生诊断也不会被自动重命名与规则文档中总是忽略的说明保持一致。验证方法很简单将上述validGlobalNamespace.ts示例写入项目并运行biome check应看到 0 个相关诊断运行biome check --write时文件内容应保持不变。由于这是 patch 级别的修复升级biomejs/biome到包含该变更的版本即可获得无需调整任何biome.json配置——该行为修复对默认配置和自定义conventions均生效因为跳过逻辑发生在选择器Selector生成阶段早于任何约定匹配。【免费下载链接】biomeA toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.项目地址: https://gitcode.com/gh_mirrors/bi/biome创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

COMSOL多物理场仿真学习指南与实战技巧

COMSOL多物理场仿真学习指南与实战技巧

1. 多物理场仿真为何需要系统学习第一次接触COMSOL Multiphysics时,我被它复杂的界面和众多选项弄得晕头转向。当时为了完成一个简单的热力耦合分析,我整整折腾了两周时间,结果模型还是不收敛。后来参加了系统的培训课程才发现,原…

📅 2026/9/20 5:44:17
Qwen1.5-7B-Chat 高效微调实战:基于 transformers 与 peft 的 Lora 指令微调全流程指南(self-llm 项目)

Qwen1.5-7B-Chat 高效微调实战:基于 transformers 与 peft 的 Lora 指令微调全流程指南(self-llm 项目)

Qwen1.5-7B-Chat 高效微调实战:基于 transformers 与 peft 的 Lora 指令微调全流程指南(self-llm 项目) 【免费下载链接】self-llm 《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、…

📅 2026/9/20 5:39:17
ESP IoT Solution 使用原生 TinyUSB 开发 USB 设备:工程搭建、配置宏与 UVC 实战指南

ESP IoT Solution 使用原生 TinyUSB 开发 USB 设备:工程搭建、配置宏与 UVC 实战指南

ESP IoT Solution 使用原生 TinyUSB 开发 USB 设备:工程搭建、配置宏与 UVC 实战指南 【免费下载链接】esp-iot-solution Espressif IoT Library. IoT Device Drivers, Documentations and Solutions. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-…

📅 2026/9/20 5:39:17
MORE NEWS

更多资讯

📰

Flutter与OpenHarmony融合开发PUBG游戏助手实践

1. 项目背景与核心价值作为一名长期从事跨平台开发的工程师,最近我在探索如何将Flutter技术栈与OpenHarmony生态相结合。选择PUBG游戏助手这个方向,是因为发现很多玩家在实战中经常面临载具选择困难的问题——不同地形该用什么车?油耗和速度如…

📰

黑苹果 OpenCore 配置要多久?用 OpCore-Simplify 十分钟生成一套完整 EFI

黑苹果 OpenCore 配置要多久?用 OpCore-Simplify 十分钟生成一套完整 EFI 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 装完系统卡在启动…

📰

高斯混合模型(GMM)原理与Matlab实战应用

1. 项目背景与核心价值高斯混合模型(Gaussian Mixture Model, GMM)作为概率生成模型的经典代表,在数据扩充、异常检测、特征工程等领域有着广泛的应用场景。我在金融风控和工业质检项目中多次使用GMM进行数据建模,发现其最大的优势…

📰

LibreChat:基于MCP协议的本地化LLM Agent交互中枢

1. LibreChat 不是另一个 Chat UI,而是 Agent 生态的本地入口LibreChat 这个名字刚出来时,我第一反应是:“又一个套壳 OpenAI 的前端?”——直到我花三天时间把它从源码编译、配置 MCP 协议、接入本地 Ollama 模型、再挂载 Figma …

📰

本地AI工作台实战:用WorkBuddy自定义指令与Skill搭建述职报告生成器

上季度述职那天,我走进会议室只带了一台笔记本。汇报到一半的时候,老板突然打断了我的节奏,把 PPT 往前翻了两页,说:“这份总结有感觉,谁帮你写的?”我指了指屏幕上正在后台跑任务的终端——一个…

📰

Ollama本地大模型部署指南:安装、加速与模型选择

1. 为什么本地跑大模型值得折腾:Ollama 的定位与核心价值第一次听说 Ollama 是在一个做私有知识库的朋友那里,他当时说了一句让我印象很深的话:“你不需要买显卡,也不需要租云算力,一台普通的开发机就能跑起来一个能对…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬