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

TypeScript中如何将JSON解析为枚举类型并处理关联desc字段

TypeScript中解析带关联字段的枚举类JSON方案

TypeScript原生枚举仅支持单值映射,无法直接绑定desc这类关联属性,你可以根据项目场景选择以下两种实现方式:

  • 方案1:保留现有枚举,额外补充映射表(兼容已有代码)
    你当前写的Type枚举不需要修改,单独维护一份枚举值和desc的映射常量即可,TS会自动做类型校验,漏写映射项时编译阶段就会报错:

    // 原有枚举定义保持不变
    enum Type {
      A = "A",
      B = "B"
    }
    
    // 建立type与desc的绑定关系
    const TypeDescMap: Record<Type, string> = {
      [Type.A]: "AAA",
      [Type.B]: "BBB"
    }
    
    // JSON解析示例
    function parseTypeData(rawJson: string) {
      const data = JSON.parse(rawJson) as { type: Type; desc: string }
      // 运行时校验type合法性,避免非法值传入
      if (!Object.values(Type).includes(data.type)) {
        throw new Error(`无效的type值: ${data.type}`)
      }
      // 如需校验传入的desc和枚举绑定的描述一致,可追加校验
      if (TypeDescMap[data.type] !== data.desc) {
        throw new Error(`type ${data.type} 对应的desc字段不匹配`)
      }
      return data
    }
    
  • 方案2:用const常量对象替代枚举(更适合多属性绑定场景,为当前TS项目主流写法)
    如果不想分开维护枚举和映射表,可以直接用as const修饰的常量对象同时存储枚举值、关联描述,既可以当枚举用,也能直接取关联属性:

    const TypeConfig = {
      A: {
        value: "A",
        desc: "AAA"
      },
      B: {
        value: "B",
        desc: "BBB"
      }
    } as const
    
    // 提取出和原枚举等价的Type类型
    type Type = typeof TypeConfig[keyof typeof TypeConfig]['value']
    
    // JSON解析示例
    function parseTypeData(rawJson: string) {
      const data = JSON.parse(rawJson) as { type: Type; desc: string }
      const matchedConfig = Object.values(TypeConfig).find(item => item.value === data.type)
      if (!matchedConfig) {
        throw new Error(`无效的type值: ${data.type}`)
      }
      if (matchedConfig.desc !== data.desc) {
        throw new Error(`desc字段与定义不匹配`)
      }
      return {
        ...data,
        config: matchedConfig
      }
    }
    

注意:TypeScript的类型校验仅在编译阶段生效,JSON反序列化后得到的是普通JS对象,运行时必须做枚举值合法性校验,避免非法入参导致逻辑异常。

内容的提问来源于stack exchange,提问作者Terriermon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:21:33