Я пытаюсь сгладить массив и получаю сообщение об ошибке -- ошибка TS2769: этому вызову не соответствует ни одна перегрузка.

Я сделал это в stackblitz, и это сработало нормально.

Оператор спреда получает ошибку: ...this.selectedInstitutions

  selectedInstitutions = [
    [{ displayValue: 'ABC', id: 781 }],
    [{ displayValue: 'DEF', id: 782 }],
  ];

  ngOnInit() {
    this.selectedInstitutions = [].concat(...this.selectedInstitutions);
  }

Сообщение об ошибке:

enter image description here

0
tshad 4 Фев 2022 в 05:47
Привет, можешь подробнее рассказать о сообщении об ошибке? Сообщение ошибка TS2769: этому вызову не соответствует перегрузка. Слишком короткое сообщение.
 – 
Yong Shun
4 Фев 2022 в 06:08

2 ответа

Лучший ответ

При использовании [].concat(someValue) пустой массив [] не имеет указанного типа и предполагается, что он имеет тип never[].

Из документов

Тип never присваивается каждому типу; однако никакому типу нельзя присвоить значение never (кроме самого never).

Поэтому, когда параметр машинописного текста strictNullChecks включен, вы получите сообщение об ошибке при попытке назначить любой другой тип на never[], что именно и происходит, когда вы делаете что-то вроде:

[].concat(...this.selectedInstitutions)

Вы можете преодолеть ошибку путем приведения типов как:

this.selectedInstitutions = ([] as any[]).concat(...this.selectedInstitutions);

Машинопись детская площадка

PS: использование типа any не рекомендуется, поэтому, если вы уже определили тип для selectedInstitutions, используйте его при приведении типов.

1
Siddhant 4 Фев 2022 в 06:28

Я не уверен, что вы пытаетесь сгладить. Ваши данные уже плоские, они имеют глубину всего 1 уровень (без внутренней вложенности). Объединение массива с данными в новый массив и присвоение его самому себе мало что дает, конечный результат всегда один и тот же, чего вы пытаетесь достичь?

В любом случае, добавление объявления типа должно решить проблему.

([] as string[]).concat('foo')

  ngOnInit() {
    this.selectedInstitutions = ([] as any[]).concat(...this.selectedInstitutions);
  }

Вот рабочий пример: https:// stackblitz.com/edit/angular-ivy-scfukg?file=src%2Fapp%2Fapp.component.ts

0
Joosep.P 4 Фев 2022 в 06:34
На самом деле это не так. это массив массивов и должен быть массивом объектов. если я не сплющу его, я не смогу использовать его в раскрывающемся списке углового множественного выбора. Я также не могу сопоставить его, как показано ниже, потому что он говорит, что displayValue не существует. Если сплющить, то работает нормально. const temp = this.selectedInstitutions.map(x => { title: x.displayValue });
 – 
tshad
4 Фев 2022 в 07:36
Спасибо, я понял.
 – 
Joosep.P
4 Фев 2022 в 08:02