js如何更好的管理项目中的枚举

本文介绍了一种有效的枚举管理方法,包括枚举的统一存放、按需访问及使用技巧。通过对枚举进行集中管理和合理组织,可以显著提高代码的可读性和可维护性。

如何更好的管理项目中的枚举?

什么是枚举? 1.枚举key,2.枚举值,3.枚举值描述

gitee源码地址

1. ❌做法

1.是这样吗?

  // 这种???
  const userState = {
    0: '离线',
    1: '在线',
    3: '隐身'
  }

2.还是这样?

 const loginState = 0;
 const getUserState = (state) => {
    if (state === 0) {
     	return '离线'
    } else if (state === 1) {
      	return '在线'
    } else if (state === 2) {
      	return '隐身'
    }
 }
// 逻辑判断
if (loginState === 1 || loginState === 2) {
	// do sth...
}

3.痛点

  • 枚举东西一旦多了起来,很难维护、管理;
  • 在代码中写0,1,2,3…可读性很差,同事看了无法理解意思;
  • 多个模块使用,定义多套,如果后段更改了值,那么前端就好玩了;

2.✅做法

统一管理

以 Vue 项目为例,枚举统一放在, ./src/common/enums/xxxx.js

|-- src 
    |-- common
    |   |   |-- enums
    |   |   |   |-- common.js   # 公共模块
    |   |   |   |-- user.js     # 用户模块
    |   |   |   |-- order.js    # 订单模块
    |   |   |   |-- auth.js     # 权限模块
    |   |   |   |-- ...         # 更多
    |--

统一按需访问

例子1,以 Vue 为例,如果在xxx页面需要使用枚举

<script>
	import { loginStateEnum } from '@enums/user' //用户模块枚举,注意:使用了别名
	export default {
		data() {
			return {
				// 登录状态
				loginState: 1
			}
		},
    	methods: {
	    	// 获取用户状态
	      	getUserState() {
	        	// 解构出来的枚举
	        	const { ON_LINE, OFF_LINE } = loginStateEnum.getValMap()
	        	const { loginState } = this
	        	if (loginState === ON_LINE) {
	        		return '用户已上线呀~'
				} else if (loginState === OFF_LINE) {
					return '用户下线了~~'
				}
	    	}
	    }
	}
</script>

例子2


import { orderStateEnum } from './common/enums/order.js' // 推荐使用按需引入你对应的枚举模块


// 获取枚举值,如:获取订单待发货枚举值
console.log("代发货:--->", orderStateEnum.getVal('AWAIT_SEND_GOODS')) // 1

// 获取多个枚举值,方法 getValList(key1, key2, ...keyn)
console.log("代发货、运输中:--->", orderStateEnum.getValList('AWAIT_SEND_GOODS', 'IN_TRANSIT')) // [0, 1]

// 获取多个枚举值,方法 getValMap(), 再配合es6 解构,是不是美滋滋??
const { AWAIT_SEND_GOODS, IN_TRANSIT, RECEIVED } = orderStateEnum.getValMap()
console.log(AWAIT_SEND_GOODS, IN_TRANSIT, RECEIVED) // 0, 1

// (获取枚举名、枚举描述、通过枚举值获取枚举描述)等更多方法请看下面文档

2.如何使用?

// 1.引入枚举包装类
import { EnumWrap } from './enum-class.js' //枚举核心模块


// 2.实例化一个用户登录状态枚举
const userLoginStateEnum = new EnumWrap({
  OFF_LINE: [0, '离线'],
  ON_LINE: [1, '在线'],
  STEALTH: [2, '隐身'],
  NOT_BOTHER: [3, '请勿打扰']
})


// 3.在使用模块导入即可, 比如定义了大模块叫 user.js 
import { userLoginStateEnum } from './src/common/enums/user.js'

// es6 解构出想要的枚举值
const { OFF_LINE, ON_LINE, STEALTH, NOT_BOTHER } = userLoginStateEnum.getValMap()

if (userState === OFF_LINE) {
	console.log('用户离线啦~')
} else if (userState === ON_LINE) {
  	console.log('用户在线啦~')
}
// next do sth....

2.内置方法

方法名参数返回值备注
getVal(key)key: 枚举中keyNumber、String单个枚举值
getValList(key1, key2, …keyn)key: 枚举keyArray,列表枚举值
getValMap(key1, key2, …keyn)key: 枚举keyObject,对象枚举值{key1: value1, key2: value2}es6解构使用更佳
getName(key)key:枚举keyString,枚举值名字

3.备注

建议大家所有枚举放在一个目录统一,如:./common/enums/模块名.js
使用地方再去引入 import { xxxxxEnum } from '@enums/user’

Q:为什么要这么做?引入?

A: 其实这样更能看出一个模块到底依赖于外部什么内容,对于后期编码很大的方法,从上往下看就知道改模块依赖于外部xxxx模块;

贴图

注册地方

在这里插入图片描述

使用地方

在这里插入图片描述

<think>好的,我现在需要回答用户的问题:如何在 JavaScript 中定义枚举类型。根据用户提供的引用资料,JavaScript本身没有内置的枚举类型,但可以通过其他方法模拟。首先,我要整理这些引用中的信息,然后按照用户的要求结构化回答。 首先,用户引用了五篇资料,其中前四篇是关于JavaScript的,第五篇提到Python的枚举,但用户的问题集中在JavaScript上,所以主要参考前四篇。引用[1]提到可以通过多种方式模拟枚举,比如对象字面量或冻结对象。引用[2]指出JavaScript没有enum关键词,需要自己创建。引用[3]提到TypeScript有枚举,但JavaScript需要用其他方法。引用[4]展示了使用对象和遍历的方法。 接下来,我需要将这些信息整理成几种常用的方法,并给出示例代码。可能的方法包括:使用对象字面量、冻结对象、结合值和反向映射、使用类封装。每个方法需要简要说明和代码示例,如用户示例中的Python代码那样用代码块展示。 然后,需要注意用户给出的系统级指令,比如行内数学表达式用$...$,但这可能用不上数学公式,主要关注代码格式。确保回答结构清晰,分点说明,并在每个方法后可能添加相关应用场景或注意事项。 还要生成相关问题,这部分需要考虑用户可能进一步的问题,比如枚举的应用场景、如何防止修改、TypeScript中的差异等。 检查是否所有引用都正确标注,比如在提到冻结对象时引用[1]和[3],在类封装时引用[4]。确保没有使用Markdown格式,但代码块需要用反引号包裹,语言注明为javascript。 最后,验证示例代码的正确性,比如Object.freeze是否确实能防止修改,类的方法是否正确。可能遇到的问题是如何确保枚举不可变,所以需要强调使用Object.freeze的重要性。 总结步骤:分四个方法介绍,每个方法给出代码示例,说明优缺点,最后添加相关问题。</think>### JavaScript 中定义枚举类型的方法 JavaScript 本身不提供内置的枚举类型[^2][^3],但可以通过以下方式模拟枚举的行为: --- #### 1. **使用对象字面量** 通过常量对象定义枚举值,避免直接修改: ```javascript const Color = { RED: 'red', GREEN: 'green', BLUE: 'blue' }; ``` - **优点**: 简单直观。 - **缺点**: 属性可能被意外修改。 --- #### 2. **冻结对象防止修改** 使用 `Object.freeze()` 使枚举不可变[^1][^3]: ```javascript const Status = Object.freeze({ PENDING: 0, APPROVED: 1, REJECTED: 2 }); ``` - **特性**: 对象属性无法增删改,避免运行时错误。 --- #### 3. **结合值与反向映射** 为枚举值同时提供键值对和反向查询功能: ```javascript const Direction = Object.freeze({ NORTH: { value: 1, display: 'North' }, SOUTH: { value: 2, display: 'South' } }); // 通过值获取枚举项 const getDirectionByValue = (value) => Object.values(Direction).find(item => item.value === value); ``` --- #### 4. **使用类封装** 通过类实现更复杂的枚举逻辑(如遍历成员)[^4]: ```javascript class Season { static SPRING = new Season('spring'); static SUMMER = new Season('summer'); constructor(name) { this.name = name; } // 遍历所有枚举值 static getAll() { return Object.values(Season).filter(v => v instanceof Season); } } ``` --- ### 应用场景 - **状态管理**: 如订单状态(待处理、已发货)[^1]。 - **配置参数**: 如颜色主题、用户权限等级。 - **替代魔法字符串**: 避免代码中直接使用未定义的字符串或数字。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值