如何在TypeScript中加载带枚举值的JSON并转换为对应类型对象
解决方案
你当前使用的是默认数字枚举,JSON中的sport是字符串类型,无法直接和枚举类型兼容,需要做显式转换和校验,不能直接用as强转绕过类型检查。
方案1:保留现有数字枚举,做键值映射转换
import * as someObject from "./deleteme.json"; enum Sports { skiing, hiking, } interface Person { name: string; sport: Sports; } // 校验sport值是否为合法枚举键 if (!Object.keys(Sports).includes(someObject.sport)) { throw new Error(`非法运动类型: ${someObject.sport}`); } // 字符串转枚举值 const steve: Person = { ...someObject, sport: Sports[someObject.sport as keyof typeof Sports] }; console.log(steve);
方案2:改用字符串枚举,转换逻辑更直观
如果你的枚举值需要和字符串直接对齐,可以将枚举定义为字符串枚举,后续适配更简单:
import * as someObject from "./deleteme.json"; enum Sports { skiing = "skiing", hiking = "hiking", } interface Person { name: string; sport: Sports; } // 自定义类型守卫校验值合法性 const isValidSport = (val: string): val is Sports => { return Object.values(Sports).includes(val as Sports); }; if (!isValidSport(someObject.sport)) { throw new Error(`非法运动类型: ${someObject.sport}`); } const steve: Person = { ...someObject, sport: someObject.sport }; console.log(steve);
补充配置说明
如果项目还未开启JSON导入支持,需要在tsconfig.json的compilerOptions中添加以下配置:
"resolveJsonModule": true:允许导入JSON文件并自动推导类型"esModuleInterop": true:兼容JSON的默认导入语法
内容的提问来源于stack exchange,提问作者mikemaccana
相关产品推荐
相关产品推荐

