【问题标题】:Typescript, ES6, Angular 12: map/copy similar objectTypescript、ES6、Angular 12:映射/复制相似对象
【发布时间】:2021-08-28 17:50:45
【问题描述】:

我有两个非常相似的模型对象(Angular 12 前端):

export interface UserGet {
   id: string;
   firstName: string;
   lastName: string;
   hobby: Hobby;
}

export interface UserPost {
   firstName: string;
   lastName: string;
   hobby: number;
}

export interface Hobby {
   id: string;
   hobby: string;
}

我想将 UserGet 对象映射到 UserPost 对象。

当前使用给定 userGet-object 的方法:

const userPost: userPost = {
   firstName: this.userGet.firstName,
   lastName: this.userGet.lastName,
   hobby: this.userGet.hobby.id;
 }

看起来很简单,但实际上,我有更多的字段,我需要用相同的方法映射更多的对象。

是否有更短/更优雅的 ES6 打字稿解决方案来映射模型,类似于我的示例,具有以下结构:

  • 目标对象中可能缺少某些字段
  • 目标对象中的某些字段可能属于不同类型

提前致谢

【问题讨论】:

  • 那么,您正在寻找类似Automapper 但用于 javascript/typescript?
  • 你为什么要这个?如果合同相同,为什么不为两者都设置一个对象?有 2 个基于 http 操作的合同是没有意义的,特别是如果您正在修改相同的资源。
  • @Bargros:模型设计正是我在其他帖子中所要求的。我听说 GET 字段类型不能与 POST 完全相同,只是因为它是同一个实体。因此合同不一样。如果您对此有其他意见,请在stackoverflow.com/questions/67940442 发表评论
  • 我已经在你的其他帖子中回复了。

标签: angular typescript ecmascript-6 ecmascript-5


【解决方案1】:

我建议您严格按照模型中的必要条件。

如果你说你有更多的属性要匹配:

  • 这些属性是否严格需要在您的前端进行处理 应用?
  • 您的前端应用真的需要所有这些属性吗?
  • 您的后端是否响应了许多不必要的属性?
export interface UserSomething {
  id?: string;  // id can be optional ( ? )
  firstName: string;
  lastName: string;
  hobby: Hobby | number | string;
}

您可以拥有一个包含所有这些属性的模型,其中一些是可选的,而另一些则是必需的。

匹配的时候,可以试试这样:

const user: UserSomething = {
  firstName: this.userGet.firstname; 
  lastName: this.userGet.lastName;
  hobby: this.userGet?.hobby; // it allows number, string or Hobby type of data
}

【讨论】:

  • 谢谢,我有这个模型设计的想法,但是当我征求意见时提出反对(参见 stackoverflow.com/questions/67940442)。如果您认为这是为每种 http 请求类型处理单独模型的方法,请在此处发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2015-11-07
  • 2016-07-25
  • 2019-03-18
相关资源
最近更新 更多