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
的函数,用于将枚举对象转换为普通对象,其中枚举的键成为普通对象的键,枚举的值成为对应键的值。但是,从代码来看,函数的目标类型转换似乎存在问题,因为它总是尝试将枚举成员的值作为字符串键添加到目标对象中,但实际上不是所有枚举成员都适合这样做。这里我将先解释代码逻辑,然后提出一个修正版本并给出使用文档。
代码逻辑解释:
- 函数
enumToObject
接受一个泛型参数T
,约束为一个记录类型(Record),其中键必须是T
的键,而值必须是number
或string
类型。 - 定义一个空对象
obj
,类型声明为与输入枚举对象结构相同的类型。 - 使用
for...in
循环遍历输入的枚举对象enumObj
的所有键。 - 获取枚举成员的值
keyStr
。 - 判断
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' }
请注意,原始代码片段的问题在于它仅在值不是数字时才将键值对添加到新对象中,而在大多数情况下,枚举的值无论是数字还是字符串都应该被复制到新对象中。
上述修正后的代码解决了这个问题。