ts封装enum枚举

191 阅读1分钟

/**
 * Enum class
 *
 * @param props  [{key: number|string, value: number|string, ...other}]
 * @example
 *  const StepEnum = new Enum([
 *    { key: 'STEP1', name: '步骤1', value: 1 },
 *    { key: 'SETP2', name: '步骤2', value: 2 },
 *  ]);
 *
 * @class Enum
 *
 * @method get(value: number|string): { key: number|string, name: string, value: number|string } | undefined
 *                    Get the object value by value
 *                    return { key: 'SETP2', name: '步骤2', value: 2 }
 *
 * @returns {key1: number|string, key2: number|string}
 * {
 *   CREATE: 1,
 *   APPROVED: 2,
 * }
 */
export default class Enum {
  private __props: { [key: number|string]: { key: number|string, name: string, value: number|string } };

  /**
   * Initialize
   * @param {Array} props []
   */
  constructor(props: { key: number|string, name: string, value: number|string }[] = []) {
    this.__props = {};
    if (props.length) {
      props.forEach((element) => {
        if (element.key && element.value) {
          this[element.key] = element.value;
          this.__props[element.value] = element;
        } else {
          console.error(element + "Enum缺少必要的key或value");
        }
      });
    }
  }

  /**
   * Get the object value by value
   * @param {string|number} value State value
   */
  get(value: number|string): { key: number|string, name: string, value: number|string } | undefined {
    return this.__props[value];
  }

  /**
   * Get the enum array
   */
  getArray(): { key: number|string, name: string, value: number|string }[] {
    const arr = [];
    for (const key in this.__props) {
      if (Object.prototype.hasOwnProperty.call(this.__props, key)) {
        arr.push(this.__props[key]);
      }
    }
    return arr;
  }
}

使用

import Enum from '/@/utils/Enum.js';

const MoldStatusEnum = new Enum([
	{
		key: 'HavingIngots',
		name: '有锭',
		value: 1,
	},
	{
		key: 'NoIngot',
		name: '无锭',
		value: 2,
	},
]);

export default MoldStatusEnum;

代码种获取

 JobStateEnum.get(value).name;
 let arr = JobStateEnum.getArray().filter((item) => item.value >= 5);