自动化重构工具强制规范枚举命名与管理,核心是“定义规则+注入检查+持续拦截”:统一PascalCase枚举名、UPPER_CASE成员名及显式字符串值,转为ESLint/SonarQube可执行规则;枚举收口至src/enums/并限制导入路径;状态流转逻辑绑定枚举声明,Zod校验API变更;数据库ENUM与TS枚举双向同步,CI自动校验迁移一致性。

直接用自动化重构工具强制规范枚举命名与管理,核心在于“定义规则 + 注入检查 + 持续拦截”。不是靠人工提醒,而是让错误在写代码时就无法提交。
统一命名规范必须落地为可执行的代码规则
枚举名必须用 PascalCase(如 OrderStatus),成员名必须用 UPPER_CASE(如 PENDING、SHIPPED),且值必须是显式字符串字面量。这些不能只写在 Wiki 里,要转成 ESLint 或 SonarQube 可识别的规则:
- 用
@typescript-eslint/naming-convention配置枚举类型和成员的命名模式 - 禁用数字枚举,通过
no-restricted-syntax拦截enum Foo { A, B }这类隐式赋值 - 要求每个枚举成员必须有 JSDoc 注释,说明业务含义和流转约束(例如“仅已支付订单可转入 REFUNDED”)
把枚举定义收口到专用模块并禁止跨域引用
所有业务枚举必须声明在 src/enums/ 下,按领域划分子目录(如 order/、payment/),且不允许从其他路径(如 utils/ 或 models/)直接定义枚举:
- 用 TypeScript 的
tsconfig.json中的baseUrl+paths统一导入路径,例如import { OrderStatus } from '@enums/order' - 用 ESLint 规则
import/no-restricted-paths禁止 import 路径含/enums/以外的枚举来源 - CI 流程中运行
tsc --noEmit+eslint --ext .ts,任一违规即中断构建
状态流转逻辑必须绑定枚举,不可硬编码跳转
订单从 PENDING 到 PAID 是合法的,但到 CANCELED 就需前置校验。这类规则不能散落在 service 里,而应随枚举一起声明:
- 在枚举模块中导出
ALLOWED_TRANSITIONS: Record<OrderStatus, OrderStatus[]>对象 - 用 Zod schema 在 API 入口自动校验状态变更是否合规,例如
z.object({ nextStatus: z.enum(Object.values(OrderStatus)).refine(isValidTransition) }) - 前端下拉选项必须用
Object.values(OrderStatus)动态生成,禁止手写字符串数组
数据库字段与枚举值保持双向强一致
PostgreSQL 的 ENUM 类型或 MySQL 的 CHECK 约束,必须与 TypeScript 枚举值完全同步:
- 用脚本自动生成 SQL 枚举定义(如从
OrderStatus枚举提取所有值,拼成CREATE TYPE order_status AS ENUM ('pending', 'paid', ...);) - 每次修改枚举,CI 自动触发数据库迁移校验:比对当前 DB 枚举值与代码中
Object.values(OrderStatus)是否一致 - ORM 层(如 TypeORM)实体字段类型必须为枚举类型,而非
string,否则编译报错

















