一个enum转antd-pro的valueEnum的函数

633 阅读1分钟

一、需求

  1. 可按条件删除某些值
  2. 保留ts的自动推断
  3. 解决antd-pro组件table编辑模式枚举值为数字无法枚举问题

二、实现

import { cloneDeep, omit, omitBy } from "lodash";

type ValueType = string | number;
interface OmitConfig<T> {
  /** 按key删除 */
  omitKeys?: (keyof T)[];
  /** 删除返回为真的enum值 */
  omitValueBy?: (value: ValueType, key: keyof T) => boolean;
}

/**
 * @description: TS的enum转antd-pro的valueEnum
 */
export function toValueEnum<T extends Record<string, ValueType>>(
  enumObj: T,
  config: OmitConfig<T> = {}
) {
  const { omitKeys, omitValueBy } = config;
  let newEnumObj = cloneDeep(enumObj);
  // 根据配置删除
  if (omitKeys) {
    newEnumObj = omit(newEnumObj, omitKeys) as any;
  }
  if (omitValueBy) {
    newEnumObj = omitBy(newEnumObj, omitValueBy) as any;
  }
  // 过滤掉enum值为number时的反向映射
  const arr = Object.entries(newEnumObj).filter((item) =>
    isNaN(Number(item[0]))
  );
  // key value对调 对应上antd pro 的 valueEnum 格式
  const newArr: [ValueType, string][] = arr.map((item) => [item[1], item[0]]);
  return new Map(newArr);
}

enum Status {
  成功,
  失败,
  未知
}

toValueEnum(Status, {
  omitKeys: ["失败"],
  omitValueBy: (val, key) => val === Status.未知
});  // Map(1){0=>'成功'}


三、适用范围 本质是返回了一个Map,适用于valueEnum的基础用法,当需要valueEnum的高级功能时不适用,如:

const valueEnum = {
  all: { text: '全部', status: 'Default' },
  open: {
    text: '未解决',
    status: 'Error',
  },
  closed: {
    text: '已解决',
    status: 'Success',
  },
};