如何转换嵌套在对象中的数组?

问题描述 投票:0回答:1

我在尝试转换包含对象数组的对象时遇到编译错误。

这就是进来的内容:

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;
  }

我该如何纠正?

javascript arrays typescript transformation
1个回答
0
投票

您应该键入Image返回数组。此外,您可以添加地图以轻松完成此操作。

static fromRaw(imageRaws: ImageRaw[]): Image[] {
  return imageRaws.map(raw => {
    return {
      uploaded: new Date(...),
      url: raw.url,
      // etc.
    }
  });
}

由于在返回指令中创建了数组,所以TS应该正确键入。

关于您的代码:

  1. 您可以通过添加var newImages: Image[] = [];使它起作用(初始化和类型定义)
  2. 您应使用push将新项目添加到数组;如果您确实要初始化数组长度(请参见related question/answer),则应添加newImages.length = imageRaws.length
© www.soinside.com 2019 - 2024. All rights reserved.