遍历数组填充JavaScript字典遇类型错误,求解决方案
解决TypeScript中字符串索引对象的类型错误问题
你遇到的是TypeScript的类型约束问题:默认创建的Object或空对象字面量不允许任意字符串索引,所以会抛出「无法通过字符串为对象赋值」「Element implicitly has an 'any' type...」这类错误。以下是几种直接的解决方法:
1. 显式定义带字符串索引的接口
给你的数据对象声明一个带索引签名的类型,明确允许字符串作为键:
// 定义适配需求的索引接口,value类型可根据实际数据调整(比如number、unknown) interface DataCollection { [key: string]: any; } // 用该类型声明变量 let data_collection: DataCollection = {}; let choices = ["hello", "world", "yeah"]; choices.forEach(choice => data_collection[choice] = choice.length); console.log(data_collection);
2. 使用TypeScript内置的Record工具类型
Record是TS专为键值对结构提供的工具类型,能快速定义字符串键的对象:
// Record<键类型, 值类型>,这里值类型用any适配通用场景 let data_collection: Record<string, any> = {}; let choices = ["hello", "world", "yeah"]; choices.forEach(choice => data_collection[choice] = choice.length); console.log(data_collection);
3. 适配你的D3请求场景
针对你用getAllData填充alldata的场景,同样给alldata加上正确的类型约束:
interface AllData { [key: string]: any; // 如果知道接口返回的具体结构,可替换成更精确的类型 } let alldata: AllData = {}; function getAllData(datapoint: string) { d3.json(dataroot + datapoint).then((res) => alldata[datapoint] = res); } // 调用时确保choice.value是字符串类型 choices.forEach((choice) => getAllData(choice.value as string));
错误原因说明
TypeScript中,new Object()或{}创建的对象默认类型为Object或{},这些类型仅允许访问已知的属性,不支持任意字符串索引。通过显式声明索引类型,你告诉TS这个对象允许用字符串作为键来存储数据,就能消除类型错误。
内容的提问来源于stack exchange,提问作者Olli
相关产品推荐
相关产品推荐

