UNPKG

define-enum

Version:

A utility function to define enum-like objects with TypeScript support.一个帮助定义枚举的工具函数

110 lines (109 loc) 3.08 kB
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 };