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

如何为字段名未知但值类型统一的对象编写TypeScript接口?

解决TypeScript中键名未知但值类型统一的对象定义问题

我来帮你梳理下当前的问题,以及对应的解决方案:

核心问题分析

你代码里的UserData接口把favorites定义成了Array<PastaData>(数组类型),但根据你的描述,favorites应该是单个对象——键名未知,但所有值都是number类型。这个类型不匹配就是导致代码无法正常工作的原因。

正确的类型定义方式

对于键名未知、值类型统一的对象,TypeScript提供了两种常用的定义方式:

方式1:使用索引签名

直接在类型中定义索引签名,明确任意字符串键对应的值类型:

// 定义favorites的类型:任意字符串键,值为number
interface FavoriteItems {
  [key: string]: number;
}

// 定义最终的用户数据类型
interface UserData {
  name: string;
  favorites: FavoriteItems; // 这里是单个对象,不是数组
}

方式2:使用内置的Record工具类型

TypeScript内置的Record<K, T>可以更简洁地定义“键类型为K、值类型为T”的对象,效果和上面的索引签名完全一致:

// 直接用Record<string, number>替代自定义接口
interface UserData {
  name: string;
  favorites: Record<string, number>;
}

修正后的完整代码

把类型定义调整后,你的map逻辑就能正常工作了:

// 方式1:自定义索引签名接口
interface FavoriteItems {
  [key: string]: number;
}

interface UserData {
  name: string;
  favorites: FavoriteItems;
}

// 或者方式2:用Record简化
// interface UserData {
//   name: string;
//   favorites: Record<string, number>;
// }

// 处理原始数据
const originalData: Array<any> = [/* 你的原始数据 */];
const parsedUserData: Array<UserData> = originalData.map(data => ({
  name: data.name,
  favorites: data.favorites
}));

额外提示

如果你的originalData里的favorites确实是数组(比如多个键值对对象的数组),那你可以把UserData里的favorites改成Array<Record<string, number>>,但根据你的描述,应该是单个对象,所以上面的写法就没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:08:42