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

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' }

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


__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/18092087.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示