define-enum
Version:
A utility function to define enum-like objects with TypeScript support.一个帮助定义枚举的工具函数
110 lines (109 loc) • 3.08 kB
JavaScript
const defineEnum = (enumItems)=>{
const enumMap = {};
const labelMap = {};
const keyMap = {};
const options = [];
const allItems = [];
const valuesSet = new Set();
const keysSet = new Set();
for (const item of enumItems){
enumMap[item.key] = item.value;
labelMap[item.value] = item.label;
keyMap[item.value] = item.key;
valuesSet.add(item.value);
keysSet.add(item.key);
allItems.push(item);
options.push({
label: item.label,
value: item.value,
disabled: item.disabled
});
}
Object.defineProperty(enumMap, 'getLabel', {
value: (key)=>labelMap[key],
writable: false,
enumerable: false,
configurable: false
});
Object.defineProperty(enumMap, 'getKey', {
value: (value)=>keyMap[value],
writable: false,
enumerable: false,
configurable: false
});
Object.defineProperty(enumMap, 'getOptions', {
value: (config)=>{
const { labelKey = 'label', valueKey = 'value', excludeDisabled = false, ...rest } = config || {};
const filter = excludeDisabled ? allItems.filter((item)=>!item.disabled) : allItems;
return filter.map((item)=>{
const { label, value, disabled } = item || {};
if (void 0 === disabled) return {
[labelKey]: label,
[valueKey]: value,
...rest
};
return {
[labelKey]: label,
[valueKey]: value,
disabled: item.disabled,
...rest
};
});
},
writable: false,
enumerable: false,
configurable: false
});
Object.defineProperty(enumMap, 'entries', {
value: ()=>[
...allItems
],
writable: false,
enumerable: false,
configurable: false
});
Object.defineProperty(enumMap, 'keys', {
value: ()=>Array.from(keysSet),
writable: false,
enumerable: false,
configurable: false
});
Object.defineProperty(enumMap, 'values', {
value: ()=>Array.from(valuesSet),
writable: false,
enumerable: false,
configurable: false
});
Object.defineProperty(enumMap, 'has', {
value: (value)=>valuesSet.has(value),
writable: false,
enumerable: false,
configurable: false
});
return enumMap;
};
const TestStatus = defineEnum([
{
key: 'UNKNOWN',
value: 0,
label: "\u672A\u77E5",
disabled: true
},
{
key: 'PASS',
value: 1,
label: "\u901A\u8FC7"
},
{
key: 'FAIL',
value: 2,
label: "\u5931\u8D25"
}
]);
console.log(TestStatus.keys());
console.log(TestStatus.values());
console.log(TestStatus.entries());
console.log(TestStatus.getOptions({
excludeDisabled: true
}));
export { defineEnum };