写了个前端维护枚举值的小工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
paledream
V2EX    分享创造

写了个前端维护枚举值的小工具

  •  
  •   paledream
    xliez 2023 年 3 月 16 日 2669 次点击
    这是一个创建于 1037 天前的主题,其中的信息可能已经有所发展或是发生改变。

    x-enum

    管理枚举值的工具

    Github

    动机

    在业务中,我们经常需要维护一些枚举值,如状态、类型,这些枚举值包含 key: 唯一键(一般为英文)value: 值(对应后端存储的数据)label: 中文名(用于展示)

    之前我会这样去维护这些枚举值:

    export enum STATUS { // key -> value TODO = 1, PENDING = 2, DOnE= 3, } export const STATUS_TEXT = { // key -> value -> label [STATUS.TODO]: "todo", [STATUS.PENDING]: "pending", [STATUS.DONE]: "done", }; 

    但是这样的维护方式有以下几个问题:

    1. STATUS_TEXT 的 key 被转为 string 而非 number, 需要转换
    2. 无法快速生成 Select 组件的 options
    3. 根据 value 取 label 比较繁琐,需要 STATUS_TEXT[STATUS.TODO]

    因此我总结了 B 端场景下的以下这些常见使用场景:

    1. select 组件的 options: 一般为 { label: string; value: string | number }[] 这样的数据
    2. 根据 key 获取 value
    3. 根据 key 获取 label
    4. 根据 value 获取 label
    5. 根据 value 获取 key
    6. 获取所有的 key
    7. 获取所有的 value
    8. 获取所有的 label

    该函数工具封装了以上业务场景的方法,方便维护枚举值,并且TS 支持 key 值的枚举推断

    使用方式

    install

    npm i @xliez/x-enum # or yarn add @xliez/x-enum # or pnpm add @xliez/x-enum 

    example

    import { Select } from "antd"; import { xEnum } from "@xliez/x-enum"; const TypeEnum = xEnum({ TODO: [0, "待办"], PENDING: [1, "处理中"], DONE: [2, "已完成"], }); // 1. 生成 select 组件 options const App = () => { return ( <> <Select label="select" name="select" optiOns={TypeEnum.genOptions()} /> </> ); }; // 2. 根据 key 取 value const value = TypeEnum.TODO.value; // 支持 TS 推断 // or const value = TypeEnum.valueByKey("TODO"); // 3. 根据 key 取 label const label = TypeEnum.TODO.label; // 支持 TS 推断 // or const label = TypeEnum.labelByKey("TODO"); // 4. 根据 value 取 label const label = TypeEnum.labelByValue(0); // 5. 根据 value 取 key const key = TypeEnum.keyByValue(0); // 6. 获取所有的 key const keys = TypeEnum.keys; // 7. 获取所有的 value const values = TypeEnum.values; // 8. 获取所有的 label const labels = TypeEnum.labels; 
    6 条回复    2023-03-16 14:15:06 +08:00
    paledream
        1
    paledream  
    OP
       2023 年 3 月 16 日
    欢迎大家 star和反馈
    vaporSpace
        2
    vaporSpace  
       2023 年 3 月 16 日
    我之前也写了类似的,但你设计的更好,如果需要这个枚举的 ts 类型要怎么搞呢
    Trim21
        3
    Trim21  
       2023 年 3 月 16 日
    你列出来的有几个功能是 ts 的 enum 原生支持的...

    ```ts
    enum STATUS {
    // key -> value
    todo = 1,
    pending = 2,
    dOne= 3,
    }

    console.log(STATUS[STATUS.todo]);
    console.log(STATUS['todo']);
    console.log(STATUS);
    ```
    paledream
        4
    paledream  
    OP
       2023 年 3 月 16 日
    @Trim21 是的,TS enum 的反向映射支持了 value -> key ,但也因为这个特性,key 和 value 实际都是 key ,所以无法使用类似 `Object.keys` 快速生成 Select options
    paledream
        5
    paledream  
    OP
       2023 年 3 月 16 日
    @vaporSpace 是类似这样的类型支持吗

    ```ts
    enum EmployeeStatus {
    }

    const F: EmployeeStatus = EmployeeStatus.xxx
    ```
    目前还不支持,后续我思考下
    Trim21
        6
    Trim21  
       2023 年 3 月 16 日 via Android   1
    @paledream 可以参考下 https://github.com/sinclairzx81/typebox 的 type helper “Static”
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3556 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 04:27 PVG 12:27 LAX 20:27 JFK 23:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86