Аргумент типа {} не может быть назначен параметру типа [] - PullRequest
0 голосов
/ 06 апреля 2020

Я сейчас работаю в angular 2, после сопоставления данных из бэкэнда я получаю сообщение об ошибке и пытаюсь вызвать функцию. Текст ошибки ниже

Аргумент типа '{дата: Дата; рецепты: рецепт []; } [] 'нельзя присвоить параметру типа' Day [] '.

Модель Day выглядит следующим образом:

import { Recipe } from "../recipes/recipe.model";

export class Day {
public date: Date;
public recipes :Recipe[]

constructor(date: Date, recipes ?: Recipe[]) {
    this.date = date;
    this.recipes = recipes;
  }

getDate(){
    return this.date;
  }
}

Произошла ошибка в методе setDays, передано Неверный параметр У меня нет рецепта, я добавляю пустой массив типа Рецепт.

Код DaysService:

import { Injectable } from "@angular/core";
import { Subject } from "rxjs";

import { Day } from "./day.model";

@Injectable()
export class DaysService {

  private startDate: Date = new Date(new Date().getTime());
  private dayLongInMS: number = 86400000;
  private daysShown: Array<Day> = [];
  daysChanged = new Subject<Day[]>();

  getDays() {
        return this.daysShown.slice();
  }

  setDays(days: Day[]) {
        this.daysShown = days;
        this.daysChanged.next(this.daysShown.slice());
    }

Я думаю, мне нужен какой-то метод, чтобы сгруппировать эти 2 параметра после деления, это будет тройная точка оператора (дата: дата; рецепты: рецепт [];) к одному (день []) свойство.

Я нахожу подобную проблему здесь: Аргумент типа {...} нельзя назначить параметру типа [] Но я не знаю, как использовать его в этом случае. Можешь дать мне совет?

1 Ответ

1 голос
/ 06 апреля 2020

Вы не возвращаете экземпляры класса Day. Клиент http не создает Day экземпляров только потому, что они заданы как тип generi c. А компилятор жалуется, потому что вы создаете объекты, которые не соответствуют интерфейсу класса Day.

Вместо этого вам нужно будет создать Day экземпляров в операторе map.

loadDays() {
  return this.http.get(this.urlDays).pipe(
    map((response: any) => {
      return response.map(day => new Day(day.date, day.recipes || []));
    }),
    tap(days => {
      this.daysService.setDays(days);
    }),
  );
}

Если вы хотите, чтобы экземпляры Day всегда инициализировались с ненулевым recipes, вы должны обрабатывать это в своем конструкторе, а не полагаться на вызывающий код.

export class Day {
  public date: Date;
  public recipes :Recipe[]

  constructor(date: Date, recipes ?: Recipe[]) {
    this.date = date;
    this.recipes = recipes || [];
  }

  getDate(){
    return this.date;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...