如何在 Prettier 中保留空花括号中的单个空格(如 { })


如何在 prettier 中保留空花括号中的单个空格(如 `{ }`)?prettier 默认会将空花括号 `{}` 格式化为紧凑形式,即使启用了 `bracketspacing: true`,该选项仅影响对象字面量和导入/导出括号的空格,**不控制函数体或类方法体中空代码块的空格**——此行为是硬编码的,不可通过配置关闭。

Prettier 的设计哲学强调一致性与最小化配置,因此对空代码块(如函数体、构造函数体、箭头函数体等)中的 {} 采用强制无空格格式(即 {}),无论 bracketSpacing 设置为何值。这一点常被误解:bracketSpacing: true 仅作用于以下场景:

  • 对象字面量:{ key: value } ✅(启用时保留空格)
  • 数组字面量:[1, 2, 3] ❌(不受 bracketSpacing 影响)
  • 导入/导出语句:import { foo } from 'bar'; ✅
  • 但不包括:function f() { }、class C { m() { } }、() => { } 等语句块中的花括号。

✅ 正确示例(bracketSpacing: true 生效):

// .prettierrc.json
{
  "bracketSpacing": true,
  "arrowParens": "always"
}
// 对象字面量保持空格
const obj = { name: "Alice", age: 30 };

// 解构导入保持空格
import { useState, useEffect } from "react";

❌ 无法实现(Prettier 强制覆盖):

class Entity {
  constructor(readonly id: string) { } // 保存后自动变为 {}
}

const fn = () => { }; // 自动变为 () => {}

⚠️ 注意事项:

  • 这不是 bug,而是 Prettier 官方明确声明的行为;文档中特别注明:“This option does not affect the spacing between braces in block statements (e.g., if, for, function, class)”
  • 若团队强依赖 { } 风格(例如用于占位、后续扩展或与 ESLint 规则协同),可考虑:
    • 使用 ESLint + @typescript-eslint/no-empty-function 或自定义规则辅助提示;
    • 在空块中添加注释(Prettier 允许保留):{ /* noop */ };
    • 不推荐禁用 Prettier 对某行的格式化(// prettier-ignore),因其破坏自动化一致性。

? 总结:Prettier 不提供控制空语句块花括号空格的开关。接受 {} 是其标准输出,也是社区广泛采纳的简洁风格。如需严格 { },应评估是否必须由 Prettier 实现——更合理的方案是统一团队认知,或通过编辑器片段(Snippet)辅助输入,而非对抗格式化器的核心约定。


# react  # js  # json  # typescript  # 编码  # if  # for  # 构造函数  # class  # function  # 对象  # this  # bug  # 自动化  # 不受  # 这不是  # 自定义  # 的花  # 而非  # 如需  # 但不  # 会将  # 因其  # 编辑器 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11怎么快速锁屏_Win11一键锁屏快捷键Win+L【基础】  c++如何获取map中所有的键_C++遍历键值对提取所有key的方法  Mac上的iMovie如何剪辑视频?(新手入门教程)  Windows系统被恶意软件破坏后的恢复策略_错误提示修复方式  Windows10系统更新错误0x80070002_Win10自动更新失败手动修复  php嵌入式多设备通信怎么实现_php同时管理多个串口设备【操作】  Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】  如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法  如何在Golang中使用log包输出不同级别日志_Golang log日志管理与分类  Win10怎么卸载迅雷_Win10彻底卸载迅雷方法【步骤】  php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】  Python列表推导式与字典推导式教程_简化代码高效写法  如何更改Windows资源管理器的默认启动位置?(快速访问/此电脑)  Win11怎么设置默认视频播放器_Windows 11关联媒体文件打开方式【步骤】  Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】  Windows如何拦截腾讯视频广告_Windows拦截腾讯视频广告方法【方法】  如何高效删除 NumPy 二维数组中所有元素相同的列  Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】  如何高效识别并拦截拼接式恶意域名 spam  c++中explicit(bool)的用法 c++条件性explicit【C++20】  Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】  微信里的php文件怎么变mp4_微信接收php转mp4操作步骤【操作】  MAC如何启用访达侧边栏显示_MAC Finder偏好设置与常用目录添加【教程】  Win11如何设置系统语言_Win11系统语言切换教程【攻略】  Win10怎样卸载自带Edge_Win10卸载Edge浏览器步骤【教程】  如何在 Go 中正确测试带 Cookie 的 HTTP 请求  如何在 Go 中创建包含映射(map)的切片(slice)结构  Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】  Golang如何实现基本的用户注册_Golang用户注册表单处理示例  Windows蓝屏BAD_POOL_HEADER故障详解_蓝屏池损坏错误修复指南  如何在 Laravel 中通过嵌套关联关系进行 orderBy 排序  php内存溢出怎么排查_php内存限制调试与优化方法【说明】  Drupal 中 HTML 链接被重复转义导致渲染异常的解决方案  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何使用Golang template生成文本模板_动态生成HTML或文本  如何有效拦截拼接式恶意域名的垃圾信息  Python类装饰器使用_元编程解析【教程】  Windows资源管理器总是卡顿或重启怎么办?(修复方法)  如何提升Golang JSON序列化性能_Golang JSON编码效率优化方法  如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法  如何自定义Windows终端的默认配置文件?(PowerShell/CMD)  Python 中将 ISO 8601 时间戳转换为日期并计算日期差值的完整教程  php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】  如何在 Python 测试中动态配置 @backoff 装饰器的重试次数  Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置  windows如何修改文件默认打开方式_windows设置程序关联教程  为什么Go建议使用error接口作为错误返回_Go Error接口设计原因说明  windows系统如何安装cab更新补丁_windows手动安装更新包教程  如何使用Golang实现错误包装与传递_Golangfmt.Errorf%w使用实践  Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】 

 2025-12-30

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.