一、需求
- 可按条件删除某些值
- 保留ts的自动推断
- 解决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',
},
};