我有以下映射,将字符串映射到任何类型的数组:
public schedule : { [dayName: string]: any[] };
当我试图预测每个键值映射时:
this.schedule.forEach(dayName, day){...}
我收到以下错误:
TS2349:无法调用类型缺少调用签名的表达式。“
答案 0 :(得分:2)
属性schedule
不是数组。它是一个可以用字符串索引的对象,该值的类型为any[]
。见documentation on indexable types.
也许你打算在访问索引后循环它:
this.schedule["somekey"].forEach(...);
或者,如果您想要遍历schedule
的密钥,请使用Object.keys
:
Object.keys(this.schedule).forEach(...);
答案 1 :(得分:2)
由于schedule
被定义为具有字符串索引签名的简单对象,因此它缺少forEach
方法。但是,它认为对象中有forEach
属性any[]
类型。并且它需要不可调用,因此错误。
要迭代对象的属性,可以使用Object.keys
函数:
Object.keys(schedule).forEach((scheduleProp) => /* do something with schedule[scheduleProp] */);
实现目标的其他方法是使用Map
:
public schedule: Map<string, any[]>;
// ...
schedule.forEach((value, key) => /* ... */);
答案 2 :(得分:1)
没有Ecmascript版本曾向对象添加方法forEach
。它存在于数组中。
ES6的地图也有forEach方法,但你在这里有一个用作地图的对象。
有很多方法可以迭代对象的键(和值),我会给你一个:
Object.keys(this.schedule).forEach(dayName => console.log(this.schedule[dayName]))