首页 > 其他分享 >enumToObject<T extends Record<keyof T, number | string>>

enumToObject<T extends Record<keyof T, number | string>>

时间:2024-03-24 09:22:19浏览次数:21  
标签:enumObj obj 对象 枚举 enumToObject const

export function enumToObject<T extends Record<keyof T, number | string>>(
	enumObj: T,
): { [K in keyof T]: ROUTE_ID_KEY } {
	const obj = {} as { [K in keyof T]: T[K] };
	for (const key in enumObj) {
		let keyStr = enumObj[key];
		if (typeof keyStr !== "number") {
			obj[keyStr as string] = enumObj[key];
		}
	}
	return obj as any;
}

这段 TypeScript 代码定义了一个名为 enumToObject 的函数,用于将枚举对象转换为普通对象,其中枚举的键成为普通对象的键,枚举的值成为对应键的值。但是,从代码来看,函数的目标类型转换似乎存在问题,因为它总是尝试将枚举成员的值作为字符串键添加到目标对象中,但实际上不是所有枚举成员都适合这样做。这里我将先解释代码逻辑,然后提出一个修正版本并给出使用文档。

代码逻辑解释:

  1. 函数 enumToObject 接受一个泛型参数 T,约束为一个记录类型(Record),其中键必须是 T 的键,而值必须是 numberstring 类型。
  2. 定义一个空对象 obj,类型声明为与输入枚举对象结构相同的类型。
  3. 使用 for...in 循环遍历输入的枚举对象 enumObj 的所有键。
  4. 获取枚举成员的值 keyStr
  5. 判断 keyStr 的类型是否为 number,如果不是,则将其当作字符串键添加到 obj 中,值为枚举成员的值。

修正后的代码:

export function enumToObject<T extends Record<keyof T, string | number>>(enumObj: T): { [K in keyof T]: T[K] } {
  const obj: Partial<{ [K in keyof T]: T[K] }> = {};
  for (const key in enumObj) {
    const value = enumObj[key];
    obj[key] = value;
  }
  return obj as { [K in keyof T]: T[K] };
}

使用文档:

函数签名:

function enumToObject<T extends Record<keyof T, string | number>>(enumObj: T): { [K in keyof T]: T[K] }

功能:
enumToObject 函数用于将一个枚举对象转换成一个普通对象,其中枚举的键和值都被复制到新的对象中。

参数:

  • enumObj:类型为泛型 T 的枚举对象,其中 T 扩展自 Record<keyof T, string | number>,表明枚举对象的键和值都是字符串或数字。

返回值:

  • 一个普通对象,其键与 enumObj 相同,值也与 enumObj 的相应键的值相同。

示例用法:

假设有一个枚举对象 MyEnum

enum MyEnum {
  Foo = 'foo',
  Bar = 123,
  Baz = 'baz'
}

const myEnumObject = enumToObject(MyEnum);
console.log(myEnumObject); // 输出: { Foo: 'foo', Bar: 123, Baz: 'baz' }

请注意,原始代码片段的问题在于它仅在值不是数字时才将键值对添加到新对象中,而在大多数情况下,枚举的值无论是数字还是字符串都应该被复制到新对象中。
上述修正后的代码解决了这个问题。

标签:enumObj,obj,对象,枚举,enumToObject,const
From: https://www.cnblogs.com/longmo666/p/18092087

相关文章