TypeScript数组:.map()不是函数

时间:2019-03-18 19:57:11

标签: angular typescript angular7

我搜索了类似这样的另一个问题,但其他问题中有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.selectedItemsBehaviorSubject<Item[]>

1 个答案:

答案 0 :(得分:1)

添加<Array<Item>>实际上不会将对象转换为数组,而只是强制类型转换,告诉打字稿将其视为数组,并且完全不影响生成的javascript。

问题在于,您用于克隆数组的传播运算符正在生成通用对象,而不是数组:

this.selectedItems = {...selectedItems};

{...obj}语法

  

将自己的可枚举属性从提供的对象复制到新对象。   Source

因此,生成的对象具有您传入的数组的length属性和所有带编号的属性,但这是一个对象,不是数组,因此没有Array.prototype方法。

但是,您可以使用spread运算符来克隆数组,只需要使用方括号来表示您正在创建数组:

this.selectedItems = [...selectedItems];

您还可以使用slice克隆阵列:

this.selectedItems = selectedItems.slice(0);