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

如何将API返回对象声明为Typescript枚举索引的类型实例?

解决枚举键嵌套对象的类型声明与数据转换问题

我来帮你搞定这个类型适配的问题~首先咱们先理清楚API返回数据和你枚举的对应关系,再一步步修正类型声明和数据处理逻辑。

先明确对应关系

你的API返回是三层嵌套结构:

  • 最外层键是字符串形式的数字("0"、"1"),对应你的Enum3(week1到week4,数值为0、1...)
  • 中间层键也是字符串数字("0"到"4"),对应Enum1(monday到friday,数值为0到4)
  • 最内层是{1: 数字},这个数字就是参赛人数

为什么你之前的声明失败?

TypeScript里的索引签名键只能是string、number或symbol,直接写{[key: Enum1]: number}会报错,而且你的层级写法(RaceDay[Key])也不符合类型定义的语法。咱们用TypeScript内置的Record<K, T>类型来解决,它专门用来定义“键为K类型、值为T类型”的对象,完美适配枚举键的场景。

正确的类型声明与数据转换

第一步:补全并明确枚举(示例)

export enum Enum3 { 
  week1 = 0, 
  week2 = 1,
  week3 = 2,
  week4 = 3
} 

export enum Enum1 { 
  monday = 0, 
  tuesday = 1,
  wednesday = 2,
  thursday = 3,
  friday = 4
}

第二步:定义最终业务类型

我们直接定义贴合需求的类型——外层是周(Enum3),每个周对应天(Enum1)到参赛人数的映射:

// 周->天->参赛人数的嵌套类型
type RaceWeekData = Record<Enum3, Record<Enum1, number>>;

第三步:转换API数据适配类型

因为API返回的键是字符串,且最内层是包裹的对象,我们需要转换一下:

// 你的API返回数据
const apiRawData = { 
  "0": { "0": { "1": 2 }, "1": { "1": 5 }, "2": { "1": 9 }, "3": { "1": 3 }, "4": { "1": 1 } }, 
  "1": { "0": { "1": 7 }, "1": { "1": 6 }, "2": { "1": 10 }, "3": { "1": 8 }, "4": { "1": 4 } } 
};

// 转换函数:把字符串键转成枚举数值,同时提取参赛人数
function convertRaceData(raw: typeof apiRawData): RaceWeekData {
  return Object.fromEntries(
    Object.entries(raw).map(([weekStr, dayEntries]) => {
      // 把周的字符串键转为Enum3的数值类型
      const week = parseInt(weekStr) as Enum3;
      // 转换天的条目:提取每个天的参赛人数
      const dayData = Object.fromEntries(
        Object.entries(dayEntries).map(([dayStr, racerObj]) => {
          const day = parseInt(dayStr) as Enum1;
          return [day, racerObj[1]]; // 取出{1: number}里的数字
        })
      ) as Record<Enum1, number>;
      return [week, dayData];
    })
  ) as RaceWeekData;
}

// 得到符合类型的实例
const raceWeeks: RaceWeekData = convertRaceData(apiRawData);

如果你不想转换数据(仅类型适配)

如果希望直接使用原始API结构,只需要调整类型来匹配:

// 最内层的参赛人数包裹对象
type RacerCountEntry = { 1: number };
// 天到参赛人数对象的映射
type DailyRaceEntry = Record<Enum1, RacerCountEntry>;
// 周到天映射的最终类型
type RawRaceWeekData = Record<Enum3, DailyRaceEntry>;

// 用类型断言直接赋值(因为API键是字符串,枚举是数字,类型需要兼容)
const rawRaceWeeks: RawRaceWeekData = apiRawData as RawRaceWeekData;

此时你可以通过rawRaceWeeks[Enum3.week1][Enum1.monday][1]获取参赛人数。

总结

  • 用Record类型是处理枚举键嵌套对象最简洁的方式,比手动写索引签名更清晰。
  • 如果API返回的键是字符串形式的数字,要么转换为数字键,要么用类型断言兼容。
  • 尽量把类型和业务需求对齐,比如直接提取参赛人数,避免多余的嵌套访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:44:00