我在尝试转换包含对象数组的对象时遇到编译错误。
这就是进来的内容:
export interface CourseRaw {
metaInfo: MetaInfoRaw;
gameCode: number;
gameText: string;
images?: ImageRaw[]; // Problems here
}
export interface ImageRaw {
uploaded: string;
url?: string;
description?: string;
fileName?: string;
}
输出应该是类型化的对象(接口),这里我已经省略了许多属性以便更好地阅读,因此“ Course”对象看起来与“ CourseRaw”对象相同,除了类型为“ Image []”。注意,“ Image”包含“ uploaded”作为日期,而不是“ ImageRaw”
中的字符串export interface Image {
uploaded: Date;
url?: string;
description?: string;
fileName?: string;
}
在转换函数中,我试图将数据复制到新的数组中,编译器不接受:
export class CourseFactory {
static fromRaw(courseRaw: CourseRaw): Course {
return {
...courseRaw,
ratingInfo: RatingFactory.fromRaw(courseRaw.ratingInfo), // demo of another nested object (works)
images: ImageFactory.fromRaw(courseRaw.images) // problematic call
};
}
我实际复制数据的尝试(失败):
static fromRaw(imageRaw: ImageRaw[]): Image[] {
var newImages;
var i;
for (i = 0; i < imageRaw.length; i++) {
newImages[i].uploaded = new Date(imageRaw[i].uploaded);
newImages[i].url = imageRaw[i].url;
newImages[i].description = imageRaw[i].description;
newImages[i].fileName = imageRaw[i].fileName;
}
return newImages;
}
我该如何纠正?
您应该键入Image
返回数组。此外,您可以添加地图以轻松完成此操作。
static fromRaw(imageRaws: ImageRaw[]): Image[] {
return imageRaws.map(raw => {
return {
uploaded: new Date(...),
url: raw.url,
// etc.
}
});
}
由于在返回指令中创建了数组,所以TS应该正确键入。
关于您的代码:
var newImages: Image[] = [];
使它起作用(初始化和类型定义)push
将新项目添加到数组;如果您确实要初始化数组长度(请参见related question/answer),则应添加newImages.length = imageRaws.length
。