在 TypeScript 中,枚举(Enum)的命名应遵循以下规范,这些规范结合了 TypeScript 官方建议和行业最佳实践:
枚举命名规范(TypeScript/Vue 项目)
基本命名规则:
使用 PascalCase(大驼峰式) 命名枚举类型
枚举成员使用 UPPER_SNAKE_CASE(全大写+下划线)
避免使用复数形式(枚举表示一组相关常量,不是集合)
typescript
复制
下载
// ✅ 正确示例 export enum UserStatus { ACTIVE = "ACTIVE", INACTIVE = "INACTIVE", PENDING_VERIFICATION = "PENDING_VERIFICATION" } export enum HttpStatusCode { OK = 200, BAD_REQUEST = 400, NOT_FOUND = 404 }
语义化命名原则:
使用名词+状态/类型的组合
包含明确的上下文信息
避免通用名称(如
Status
,Type
)
typescript
复制
下载
// ✅ 推荐(包含上下文) export enum OrderPaymentStatus { UNPAID = "UNPAID", PARTIALLY_PAID = "PARTIALLY_PAID", PAID = "PAID", REFUNDED = "REFUNDED" } // ❌ 避免(过于通用) export enum Status { ACTIVE = 1, DISABLED = 0 }
项目中的最佳实践:
统一前缀(可选):对相关枚举使用相同前缀
文件组织:将枚举放在
/src/enums/
目录导出规范:使用命名导出(非默认导出)
typescript
复制
下载
// /src/enums/user.enum.ts export enum UserRole { ADMIN = "ADMIN", EDITOR = "EDITOR", VIEWER = "VIEWER" } export enum UserAccountType { STANDARD = "STANDARD", PREMIUM = "PREMIUM", ENTERPRISE = "ENTERPRISE" }
Vue 组件中的使用规范:
在
<script setup>
中直接导入模板中使用带命名空间的枚举值
vue
复制
下载
<script setup lang="ts"> import { UserRole } from '@/enums/user.enum' const currentRole = UserRole.ADMIN </script> <template> <div v-if="currentRole === UserRole.ADMIN"> <!-- 管理员内容 --> </div> </template>
字符串 vs 数字枚举:
优先使用 字符串枚举(更好的可读性和调试体验)
数字枚举仅用于性能关键场景或位运算
typescript
复制
下载
// ✅ 字符串枚举(推荐) export enum Direction { UP = "UP", DOWN = "DOWN", LEFT = "LEFT", RIGHT = "RIGHT" } // ⚠️ 数字枚举(特定场景使用) export enum FilePermission { READ = 1, // 0001 WRITE = 2, // 0010 EXECUTE = 4 // 0100 }
常量枚举注意事项:
使用
const enum
仅适用于性能敏感场景会完全移除运行时代码,影响调试
typescript
复制
下载
// ❌ 常规项目慎用(无法在运行时访问) const enum SecretCodes { KEY1 = 0xABC, KEY2 = 0xDEF } // ✅ 普通枚举更安全 export enum ApiKeys { CLIENT_ID = "AK_123456", SECRET = "SK_789012" }
命名禁忌
避免的行为:
typescript
复制
下载
// ❌ 混合大小写 enum badNaming { mixedCase = 1 // 避免 } // ❌ 单数形式表示集合 enum Color { RED, GREEN, BLUE // 应命名为 Colors? } // ❌ 动词命名 enum ProcessData { // 枚举应是状态描述 START, STOP // 而非动作 }
不要重复前缀:
typescript
复制
下载
// ❌ 冗余前缀 enum UserUserRole { // User 重复 USER_ADMIN, USER_EDITOR } // ✅ 简洁命名 enum UserRole { ADMIN, EDITOR }
项目一致性建议
在项目中建立
enums
目录集中管理添加 ESLint 规则强制枚举命名规范:
json
复制
下载
// .eslintrc.json { "rules": { "@typescript-eslint/naming-convention": [ "error", { "selector": "enum", "format": ["PascalCase"], "prefix": ["Enum"] // 可选前缀 }, { "selector": "enumMember", "format": ["UPPER_CASE"] } ] } }
遵循这些规范能显著提升代码可读性和维护性,尤其在团队协作的 Vue+TypeScript 项目中。
在 Vue 3 + TypeScript 项目中,enums
目录的常规结构通常遵循模块化和可维护性原则。以下是典型的组织结构和最佳实践:
标准目录结构示例
text
复制
下载
src/ ├── enums/ # 枚举根目录 │ ├── system/ # 系统级枚举 │ │ ├── http.enum.ts # HTTP 状态码枚举 │ │ ├── error-codes.enum.ts │ │ └── index.ts # 统一导出 │ │ │ ├── business/ # 业务相关枚举 │ │ ├── order-status.enum.ts │ │ ├── payment-method.enum.ts │ │ └── index.ts │ │ │ ├── user/ # 用户相关枚举 │ │ ├── user-role.enum.ts │ │ ├── user-status.enum.ts │ │ └── index.ts │ │ │ ├── ui/ # UI/组件相关枚举 │ │ ├── button-variant.enum.ts │ │ ├── notification-type.enum.ts │ │ └── index.ts │ │ │ ├── shared/ # 跨模块通用枚举 │ │ ├── date-formats.enum.ts │ │ ├── country-codes.enum.ts │ │ └── index.ts │ │ │ └── index.ts # 总入口文件(可选)
关键实践说明
分类组织
按功能域分组:系统、业务、用户、UI 等
按模块分组:适合大型项目(如
auth/
,order/
,product/
)通用共享枚举:放在
shared/
目录
文件命名规范
使用
*.enum.ts
后缀明确文件类型短横线命名:
order-status.enum.ts
枚举名与文件名一致(PascalCase):
typescript
复制
下载
// order-status.enum.ts export enum OrderStatus { PENDING = "PENDING", PROCESSING = "PROCESSING", SHIPPED = "SHIPPED" }
索引文件(index.ts)
每个子目录使用index.ts
统一导出:typescript
复制
下载
// system/index.ts export * from './http.enum'; export * from './error-codes.enum';
总入口文件(可选)
typescript
复制
下载
// enums/index.ts export * as SystemEnums from './system'; export * as BusinessEnums from './business'; export * as UserEnums from './user';
使用场景示例
组件中使用
vue
复制
下载
<script setup lang="ts"> // 按需导入(推荐) import { OrderStatus } from '@/enums/business/order-status.enum'; // 通过索引文件导入 import { UserRole } from '@/enums/user'; </script>
统一导入方式
typescript
复制
下载
// 通过总入口导入(适合频繁使用的枚举) import { SystemEnums, UserEnums } from '@/enums'; console.log(SystemEnums.HttpStatus.OK); // 200 console.log(UserEnums.UserRole.ADMIN); // "ADMIN"
高级组织结构
方案 1:按业务模块划分(推荐)
text
复制
下载
enums/ ├── order/ │ ├── status.enum.ts │ ├── payment-type.enum.ts │ └── index.ts ├── product/ │ ├── category.enum.ts │ ├── availability.enum.ts │ └── index.ts └── auth/ ├── permission.enum.ts └── index.ts
方案 2:按枚举类型划分
text
复制
下载
enums/ ├── numeric/ │ ├── http-status.enum.ts │ └── error-codes.enum.ts ├── string/ │ ├── user-roles.enum.ts │ └── order-status.enum.ts └── const/ ├── ui-variants.enum.ts └── icon-types.enum.ts
最佳实践建议
单一职责原则
每个文件只包含 1 个主要枚举(相关辅助枚举可共存)
避免创建包含多个无关枚举的 "global.enum.ts"
树摇优化
typescript
复制
下载
// 避免默认导出(影响 tree-shaking) // ❌ 不推荐 export default enum Status { ... } // ✅ 推荐使用命名导出 export enum OrderStatus { ... }
常量枚举处理
对于const enum
,创建单独目录或添加注释:typescript
复制
下载
// system/const-enums/ // 或添加特殊后缀 export const enum CacheKeys { USER_PROFILE = "user_profile", APP_CONFIG = "app_config" }
自动生成枚举
如果使用 OpenAPI 等工具生成:text
复制
下载
enums/ ├── generated/ # 自动生成的枚举 │ ├── api-models.enum.ts │ └── ... └── manual/ # 手动维护的枚举 ├── ui.enum.ts └── ...
典型文件示例
用户角色枚举 (enums/user/user-role.enum.ts
)
typescript
复制
下载
export enum UserRole { /** 系统管理员 */ ADMIN = "ADMIN", /** 内容编辑者 */ EDITOR = "EDITOR", /** 普通查看用户 */ VIEWER = "VIEWER", /** 访客(未登录用户) */ GUEST = "GUEST" } // 类型导出(方便同时作为类型使用) export type UserRoleType = `${UserRole}`;
HTTP 状态枚举 (enums/system/http.enum.ts
)
typescript
复制
下载
export enum HttpStatus { OK = 200, CREATED = 201, BAD_REQUEST = 400, UNAUTHORIZED = 401, FORBIDDEN = 403, NOT_FOUND = 404, INTERNAL_SERVER_ERROR = 500 } // 状态码描述映射 export const HttpStatusMessage: Record<HttpStatus, string> = { [HttpStatus.OK]: "请求成功", [HttpStatus.CREATED]: "资源创建成功", // ...其他描述 };
目录结构选择建议
项目规模 | 推荐结构 | 特点 |
---|---|---|
小型项目 | 平铺结构 (enums/*.enum.ts ) |
简单直接,无需嵌套 |
中型项目 | 功能域分组 | 平衡查找效率和组织结构 |
大型项目 | 业务模块分组 | 与功能模块对齐,便于跨团队协作 |
对接后端API | 混合结构(生成+手动) | 分离自动生成和自定义枚举 |
这种组织方式确保:
快速定位枚举定义
避免命名冲突
支持按需加载
保持类型系统完整性
便于维护和扩展