Skip to content

@utilslib/core/createEnum


创建一个具有双向映射的枚举对象。


createEnum

函数签名

typescript
function createEnum<T extends { [key: string]: string | number }>(enumObj: T): Readonly<T & { [K in T[keyof T]]: keyof T }>

描述

创建一个具有双向映射的枚举对象。

类型参数

参数名约束默认值描述
T\{ \[key: string\]: string | number \}--

参数

参数名类型可选默认值描述
enumObjT--

返回值

Readonly<T & { [K in T[keyof T]]: keyof T }>

点击查看源码
js
/**
 * 创建一个具有双向映射的枚举对象。
 *
 * @param {Object} enumObj - 原始枚举对象,包含键值对
 * @returns {Object} 返回具有双向映射且冻结的枚举对象
 *
 * @throws {TypeError} 当枚举值类型不是 string 或 number 时抛出错误
 */
export function createEnum(enumObj) {
  const result = Object.create({});
  for (const key in enumObj) {
    if (!Object.prototype.hasOwnProperty.call(enumObj, key)) continue;
    const value = enumObj[key];
    if (typeof value !== "string" && typeof value !== "number") {
      throw new TypeError(
        `Enum value must be string or number, got ${typeof value}`,
      );
    }
    result[key] = value;
    Object.defineProperty(Object.getPrototypeOf(result), value, {
      value: key,
      enumerable: false,
      writable: false,
      configurable: false,
    });
  }
  return Object.freeze(result);
}
ts
/**
 * 创建一个具有双向映射的枚举对象。
 *
 * @param {Object} enumObj - 原始枚举对象,包含键值对
 * @returns {Object} 返回具有双向映射且冻结的枚举对象
 *
 * @throws {TypeError} 当枚举值类型不是 string 或 number 时抛出错误
 */
export function createEnum<T extends { [key: string]: string | number }>(
  enumObj: T,
): Readonly<T & { [K in T[keyof T]]: keyof T }> {
  const result = Object.create({}) as T & { [K in T[keyof T]]: keyof T };

  for (const key in enumObj) {
    if (!Object.prototype.hasOwnProperty.call(enumObj, key)) continue;
    const value = enumObj[key];
    if (typeof value !== "string" && typeof value !== "number") {
      throw new TypeError(
        `Enum value must be string or number, got ${typeof value}`,
      );
    }
    result[key] = value;
    Object.defineProperty(Object.getPrototypeOf(result), value, {
      value: key,
      enumerable: false,
      writable: false,
      configurable: false,
    });
  }

  return Object.freeze(result);
}

如有错误,请提交issue :::