我搜索了类似这样的另一个问题,但其他问题中有99%与一个Observable有关,但我不是。我有看起来像这样的代码:
selectedItems: Item[] = null;
selectedDate: Date = null;
submitItems() {
const itemObservables = this.selectedItems.map(item => {
item.date = this.selectedDate;
return this.itemService.putMovedItems(item)
});
return forkJoin(itemObservables);
}
在VSCode中,没有棉绒错误;这应该是有效的代码。但是,在运行时,我得到“ TypeError:selectedItems.map不是函数”。
调试时,我注意到this.selectedItems说:
Object {0: Item, 1: Item, 2: Item, ...}
这使我怀疑设置属性后,它没有被设置为实际的数组。因此,我尝试通过以下方式进行投射:
const items = <Array<Item>>this.selectedItems;
,然后在items
上执行映射,但是遇到了相同的运行时错误。我不确定这是怎么回事。
编辑:为清楚起见,在ngOnInit()中设置了selectedItems
:
ngOnInit() {
const selectedItems = this.itemService.selectedItems.getValue();
this.selectedItems = {...selectedItems};
}
this.itemService.selectedItems
是BehaviorSubject<Item[]>
。
答案 0 :(得分:1)
添加<Array<Item>>
实际上不会将对象转换为数组,而只是强制类型转换,告诉打字稿将其视为数组,并且完全不影响生成的javascript。
问题在于,您用于克隆数组的传播运算符正在生成通用对象,而不是数组:
this.selectedItems = {...selectedItems};
{...obj}
语法
将自己的可枚举属性从提供的对象复制到新对象。 Source
因此,生成的对象具有您传入的数组的length属性和所有带编号的属性,但这是一个对象,不是数组,因此没有Array.prototype方法。
但是,您可以使用spread运算符来克隆数组,只需要使用方括号来表示您正在创建数组:
this.selectedItems = [...selectedItems];
您还可以使用slice克隆阵列:
this.selectedItems = selectedItems.slice(0);