如何在TypeScript中实现枚举转嵌套组合值对象的工具函数
实现方案
完整可运行代码
你可以直接复用以下实现,适配你已经定义的枚举结构:
// 你已定义的枚举 enum ActionTypes { Find, Update, Create } enum RequestTypes { Request, Success, Failure } // 工具函数实现 function createActions<T extends object>(actionEnum: T): { [ActionKey in keyof T]: { [ReqKey in keyof typeof RequestTypes]: `${string & ActionKey}${string & ReqKey}` } } { // 过滤数字枚举的反向映射,拿到枚举定义的有效字符串键 const actionKeys = Object.keys(actionEnum).filter(key => isNaN(Number(key))) as Array<keyof T> const requestKeys = Object.keys(RequestTypes).filter(key => isNaN(Number(key))) as Array<keyof typeof RequestTypes> const result = {} as ReturnType<typeof createActions<T>> for (const actionKey of actionKeys) { result[actionKey] = {} as any for (const reqKey of requestKeys) { result[actionKey][reqKey] = `${String(actionKey)}${String(reqKey)}` as const } } return result } // 调用示例 const actions = createActions(ActionTypes) // 调用效果完全符合预期: // actions.Find.Request -> 'FindRequest' // actions.Create.Failure -> 'CreateFailure'
实现说明
- 类型层面:通过泛型+映射类型自动推导返回值的精确类型,调用时无需额外写类型注解,即可获得完整的智能提示,所有枚举键都不会拼写错误
- 运行时层面:过滤了TS数字枚举的反向映射(数字枚举编译后会同时存在
Find:0和0:'Find'两组键值对,过滤数字键即可拿到我们定义的Find/Update/Create有效键) - 兼容性:同时支持数字枚举、字符串枚举作为入参,不需要修改实现逻辑
内容的提问来源于stack exchange,提问作者Shannon Hochkins
相关产品推荐
相关产品推荐

