Почему TS выдает эту ошибку «Аргумент типа ‘MyMedicine[]’ не может быть присвоен параметру типа ‘MyMedicine'».?

#angular #typescript #observable #mean-stack

#angular #typescript #наблюдаемый #средний стек

Вопрос:

У меня есть интерфейс:

 export interface MyMedicine {
_id: String;
name: String;
quantity: Number;
time: String;
  

}

Это мой угловой сервис для публикации данных:

 postMed(newMed): Observable<MyMedicine[]>{
var headers = new HttpHeaders();
headers.append('Content-Type', 'application/json');
return this.http.post<MyMedicine[]>(`${this.url}/api/medicine`, newMed, {headers:headers});
  

}

Это мой компонент с addmedicine () для публикации данных при отправке формы:

 addmedicine(){
const newMedicine = {
  name: this.name,
  quantity: this.quantity,
  time: this.time
};
this.medService.postMed(newMedicine)
    .subscribe(medicine =>{
      this.medicines.push(medicine);
    })}
  

Я получаю сообщение об ошибке, в котором говорится: «Аргумент типа ‘MyMedicine[]’ не может быть присвоен параметру типа ‘MyMedicine’.
В типе ‘MyMedicine[]’ отсутствуют следующие свойства из типа ‘MyMedicine’: _id, имя, количество, время»

Я импортировал интерфейс и сервис в свой компонент. Внедрение зависимостей было выполнено. _id — это идентификатор по умолчанию, который генерируется MongoDB.

Комментарии:

1. Не могли бы вы попробовать с this.medicines = [...this.medicines, ...medicine] ?

2. @VLAZ Все наоборот. postMed возвращает массив элементов и this.medicines.push ожидает один элемент.

3. @Emilien Я попробовал ваш метод, и я получаю сообщение об ошибке «В типе ‘MyMedicine[]’ отсутствуют следующие свойства из типа ‘MyMedicine’: _id, имя, количество, время»

Ответ №1:

Как мы уже говорили вам в комментариях выше, проблема в том, что вы получаете из this.medService.postMed массива MyMedicine .

Одним из решений является добавление только последнего элемента из полученного массива.

 medicines: MyMedicines[];

this.medService.postMed(newMedicine).subscribe(medicines => this.medicines.push(medicines.pop()))
  

Комментарии:

1. Спасибо @Emilien. Теперь ошибки нет, но ничего не обновляется в БД. Я протестировал свой API в Postman, и он работает.

Ответ №2:

Поскольку HTTP-запрос post возвращает только недавно добавленный элемент в массив MyMedicines [], измените метод postMed, как показано ниже:

 postMed(newMed): Observable<MyMedicine>{
var headers = new HttpHeaders();
headers.append('Content-Type', 'application/json');
return this.http.post<MyMedicine>(`${this.url}/api/medicine`, newMed, {headers:headers});
  

а затем в классе component используйте наблюдаемый, который выдается HTTP post запросом, как показано ниже :

 addmedicine(){
const newMedicine = {
  name: this.name,
  quantity: this.quantity,
  time: this.time
};
this.medService.postMed(newMedicine)
    .subscribe((medicine : MyMedicine) =>{
      this.medicines.push(medicine);
    })}
  

Пожалуйста, проверьте со своей стороны, работает ли он.