创建一个具有双向映射的枚举对象。
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 \} | - | - |
参数
| 参数名 | 类型 | 可选 | 默认值 | 描述 |
|---|---|---|---|---|
enumObj | T | 否 | - | - |
返回值
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 :::