enum-plus 全面实战指南:让你的 TypeScript 枚举焕然一新

419 阅读3分钟

enum-plus 是一个增强型的枚举库,完全兼容原生的 TypeScript enum,并扩展了显示文本、本地化、UI 控件绑定、枚举项遍历等强大功能。这是一个轻量级、零依赖的 TypeScript 库,可与任何前端框架配合使用。

特性

  • 完全兼容原生 enum 行为:支持 numberstring 等多种数据类型。
  • 增强的枚举项:可自定义显示文本,支持本地化,方便与任何 i18n 库集成。
  • 丰富的 API:提供便捷的方法,如获取枚举项的显示文本、遍历枚举项、判断值是否存在等。
  • UI 集成:可与 Ant Design、ElementPlus、Material-UI 等 UI 库无缝集成,仅需一行代码即可生成下拉菜单、复选框等组件。
  • TypeScript 支持:提供全面的类型推断,增强开发体验。
  • 轻量级:仅 2KB+,无任何依赖。

安装

使用 npm 安装:

npm install enum-plus

使用 yarn 安装:

yarn add enum-plus

枚举初始化

enum-plus 提供多种方式初始化枚举,可根据具体需求选择最适合的方式。

1. 简单的 key-value 格式

直接映射键和值,类似于原生枚举格式。

import { Enum } from 'enum-plus';

const Week = Enum({
  Sunday: 0,
  Monday: 1,
} as const);

console.log(Week.Monday); // 输出: 1

注意:在 TypeScript 中使用 as const 类型断言,确保枚举值被视为字面量类型。如果使用 JavaScript,请移除 as const

2. 带字符串值的 key-value 格式

允许使用字符串作为值。

import { Enum } from 'enum-plus';

const Week = Enum({
  Sunday: 'Sun',
  Monday: 'Mon',
} as const);

console.log(Week.Monday); // 输出: 'Mon'

3. 标准格式(推荐)

包含 valuelabel,可为每个枚举项指定显示文本,适用于 UI 组件。

import { Enum } from 'enum-plus';

const Week = Enum({
  Sunday: { value: 0, label: '我爱星期天' },
  Monday: { value: 1, label: '我讨厌星期一' },
} as const);

console.log(Week.Sunday); // 输出: 0
console.log(Week.label(0)); // 输出: '我爱星期天'

4. 仅 label 格式

使用键作为值。

import { Enum } from 'enum-plus';

const Week = Enum({
  Sunday: { label: '我爱星期天' },
  Monday: { label: '我讨厌星期一' },
} as const);

console.log(Week.Sunday); // 输出: 'Sunday'
console.log(Week.label('Sunday')); // 输出: '我爱星期天'

5. 数组格式

适用于需要动态创建枚举的场景,例如从 API 数据生成枚举。

import { Enum } from 'enum-plus';

// 假设 getPetsData() 返回类似以下的数据
const petTypes = await getPetsData();
// [
//   { value: 1, key: 'dog', label: '狗' },
//   { value: 2, key: 'cat', label: '猫' },
//   { value: 3, key: 'rabbit', label: '兔子' }
// ];
const PetTypes = Enum(petTypes);

6. 原生枚举格式

可从原生枚举创建,利用原生枚举的自增行为。

import { Enum } from 'enum-plus';

enum Init {
  Sunday = 0,
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday,
}
const Week = Enum(Init);

console.log(Week.Sunday); // 输出: 0
console.log(Week.Monday); // 输出: 1
console.log(Week.Saturday); // 输出: 6
console.log(Week.label('Sunday')); // 输出: 'Sunday'

API

enum-plus 提供丰富的 API,方便开发者操作和扩展枚举。

  • Enum.XXX:直接访问枚举值,类似于原生 enum

    console.log(Week.Sunday); // 输出: 0
    console.log(Week.Monday); // 输出: 1
    
  • items:返回所有枚举项的只读数组,结构符合 Ant Design 组件规范,可用于生成下拉菜单、复选框等 UI 控件。

  • keys:返回所有枚举项的键名数组。

  • label(keyOrValue?: string | number): string | undefined:根据值或键获取枚举项的显示文本,支持本地化。

    console.log(Week.label(1)); // 输出: 'Monday'
    console.log(Week.label('Monday')); // 输出: 'Monday'
    
  • key(value?: string | number): string | undefined:根据值获取枚举项的键名。

    console.log(Week.key(1)); // 输出: 'Monday'
    
  • has(keyOrValue?: string | number): boolean:判断某个枚举项(值或键)是否存在。

    console.log(Week.has(1)); // 输出: true
    console.log(Week.has('Sunday')); // 输出: true
    console.log(Week.has(9)); // 输出: false
    console.log(Week.has('Birthday')); // 输出: false
    
  • toSelect(config?: OptionsConfig): {value, label}[] :返回仅包含 labelvalue 字段的枚举项数组,可用于生成