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

