这是一套 TypeScript 与 JavaScript 的编码风格约定,核心是自上而下的叙事式组织:文件从入口读到叶子,读者先看到最高层内容,再逐层深入依赖。
主要能力与规则:
- 代码组织:导入之后先放模块级常量与变量,再放共享类型(主类型在前),然后是入口函数,最后按调用顺序排列内部函数;辅助函数紧跟其调用者下方。仅被单个声明使用的类型放在该声明之前。导出本身不是排序依据。
- 代码质量:追求优雅实现,避免重复逻辑与冗余昂贵操作,在函数间传递已算好的值,多用提前返回;单行可容纳的 throw/return/continue/break 写成一行;函数保持小而单一职责,实现不超过约一屏(约 50 行)。
- 类型与语法:避免 any,找不到合适类型时加 /* FIXME */;优先 interface 而非 type;泛型用单个大写字母;不用 enum 和 namespace;优先 const、undefined、??、++i、new Error();顶层用 function/class 声明式语法;字符串联合类型值用 camelCase;不用空字符串作默认值;字符串/数字/布尔的存在性判断用显式比较而非布尔强制转换。
- 导入:始终用 ESM 语法,避免循环导入,避免内联 import() 与内联类型导入。
- OOP:优先工厂函数与带上下文对象的函数,避免类继承(框架要求除外)。
- 注释:越少越好,删除与代码重复的注释,仅保留 hack、TODO、例外情况或结构不明显的说明。
- 依赖:添加依赖前先搜索代码库复用已有版本,否则用默认安装命令装最新版。
- 提交与变更:提交、PR/MR、changeset 信息不得添加 AI 署名;changeset 面向已有用户,只写可操作内容,单段简短。
- 版本:未经明确指示不得把 0.x.x 升到 1.0.0。
适用场景:团队或个人在 TypeScript/JavaScript 项目中统一代码风格、评审与重构。限制:这是一套约定,未提供具体工具、安装命令或自动化配置;部分规则(如 linter 规则变更需先讨论)依赖团队流程。