如何为字段名未知但值类型统一的对象编写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
相关产品推荐
相关产品推荐

