在 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, // 0001WRITE = 2, // 0010EXECUTE = 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 | 混合结构(生成+手动) | 分离自动生成和自定义枚举 |
这种组织方式确保:
-
快速定位枚举定义
-
避免命名冲突
-
支持按需加载
-
保持类型系统完整性
-
便于维护和扩展