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
相关产品推荐
相关产品推荐

