TypeScript Array: .map () не является функцией - PullRequest
0 голосов
/ 18 марта 2019

Я искал другой вопрос, подобный этому, но 99% других вопросов касаются Наблюдаемой, которой я не являюсь.У меня есть код, который выглядит так:

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, но я получил ту же ошибку времени выполнения.Я не уверен, что здесь происходит.

Редактировать: Для ясности, selectedItems устанавливается в ngOnInit ():

ngOnInit() {
    const selectedItems = this.itemService.selectedItems.getValue();
    this.selectedItems = {...selectedItems};
}

this.itemService.selectedItems это BehaviorSubject<Item[]>.

1 Ответ

1 голос
/ 19 марта 2019

Добавление <Array<Item>> на самом деле не превратит объект в массив, это просто приведение к тому, чтобы машинописность воспринимала его как массив, и вообще не влияет на созданный javascript.

Проблема в том, что оператор распространения, который вы используете для клонирования вашего массива, создает общий объект, а не массив:

this.selectedItems = {...selectedItems};

Синтаксис {...obj}

копирует собственные перечисляемые свойства из предоставленного объекта в новый объект. Источник

Таким образом, результирующий объект имеет свойство длины и все пронумерованные свойства массива, в который вы передали, но это объект, а не массив и поэтому не имеет методов Array.prototype.

Однако вы можете использовать оператор распространения для клонирования массива, вам просто нужно использовать квадратные скобки, чтобы обозначить, что вы создаете массив:

this.selectedItems = [...selectedItems];

Вы также можете клонировать массив, используя slice:

this.selectedItems = selectedItems.slice(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...