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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:24:03