Arrays {}类型的参数不能分配给[]类型的参数
我目前在angular 2中工作,在从后端映射数据后,我得到错误,并尝试调用函数。下面是错误文本 类型为“{date:date;recipes:Recipe[];}[]”的参数不能分配给类型为“Day[]”的参数。 日模型如下所示:Arrays {}类型的参数不能分配给[]类型的参数,arrays,json,angular,typescript,Arrays,Json,Angular,Typescript,我目前在angular 2中工作,在从后端映射数据后,我得到错误,并尝试调用函数。下面是错误文本 类型为“{date:date;recipes:Recipe[];}[]”的参数不能分配给类型为“Day[]”的参数。 日模型如下所示: import { Recipe } from "../recipes/recipe.model"; export class Day { public date: Date; public recipes :Recipe[] constructor(date:
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方法出错,传递的参数无效
loadDays() {
return this.http.get<Day[]>(
this.urlDays,
).pipe(
map((days => {
return days.map(day => {
return {
...day,
recipes: day.recipes ? day.recipes : []
};
});
})),
tap(days => {
this.daysService.setDays(days);
}),
);
}
我检查我得到的数据是否有菜谱,如果有,我不chenge菜谱,如果我没有菜谱,我添加菜谱类型的空数组
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());
}
从“@angular/core”导入{Injectable};
从“rxjs”导入{Subject};
从“/Day.model”导入{Day};
@可注射()
导出类DaysService{
private startDate:Date=新日期(new Date().getTime());
私人日长:数量=86400000;
私有日显示:数组=[];
daysChanged=新主题();
getDays(){
返回此.daysShown.slice();
}
设定天数(天:天[]){
this.daysShown=天;
this.daysChanged.next(this.daysShown.slice());
}
我想我需要一些方法将这两个参数分组,在将其划分为运算符三点(日期:date;recipes:Recipe[];)到一个(Day[])属性之后
我在这里发现了类似的问题:
但是我不知道如何使用它来处理我的情况。你能给我一些建议吗?你没有返回
Day
类的实例。http客户端不会创建Day
实例,只是因为它们是作为泛型类型提供的。编译器会抱怨,因为你创建的对象不符合他每天上课
相反,您需要在map
操作符中创建Day
实例
loadDays(){
返回this.http.get(this.urlDays).pipe(
map((响应:任意)=>{
返回response.map(day=>newday(day.date,day.recipes | | |[]);
}),
点击(天数=>{
this.daysService.setDays(天);
}),
);
}
如果要确保始终使用非空的recipes
初始化Day
实例,则应在构造函数中处理该问题,而不是依赖调用代码
导出课程日{
公开日期:日期;
公共配方:配方[]
构造函数(日期:日期,配方?:配方[]){
this.date=日期;
this.recipes=recipes | |[];
}
getDate(){
返回此日期;
}
}
this.daysService.setDays函数的签名是什么?谢谢Kurt Hamilton的回答,我在考虑这个解决方案,但是,我正在寻找一些解决方案,只使用管道将数据转换为corect表单,而不使用map方法中的构造函数。您需要符合Day
类的接口。您可以他们需要使用构造函数或返回一个包含所有属性和函数的对象。你并不真的想重新创建函数逻辑,所以我认为构造函数方法是最好的方法。你可以始终使用getDate()
功能在课程当天是可选的,但是如果是可选的,那么拥有它有什么意义呢?根据经验,我发现通常最好保留手动控制不同层之间的数据通信。现在额外键入一点似乎是一种痛苦,但在从长远来看。
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());
}