You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:27:05