【问题标题】:Mapping response to Model - best practise将响应映射到模型 - 最佳实践
【发布时间】:2017-12-15 12:24:50
【问题描述】:

在这里了解 Angular 4、5 并想知道将 JSON 响应映射到强类型对象/模型的最佳实践。

服务:

getUsers(): Observable<User[]> {
  return this.http.get<User[]>('http://localhost:8000/users/')
    .pipe(
      tap(users => this.log(`fetched users`)),
      map(response => {
        return response.map((res) =>
        {
          return new Hero(
            response['username'],
            response.email);
        });
      }),
      catchError(this.handleError('getUsers', []))
    );
}

接口/型号:

export interface IUser {

    id: number;
    name: string;
    email: string;
}

export class Hero implements User {

    public id: number;

    constructor(public name: string,
            public email: string) {

  }
}

getUsers 返回一个带有用户对象的 Observable 数组。 username 不是该对象的成员,所以我使用这个括号表示法,因为点表示法会出错。显然,为了可测试性/清晰性,我最终会将 Map 函数变成一个单独的函数。

如何正确处理这种映射/重映射/转换?

【问题讨论】:

  • 您可以直接将其类型转换为return &lt;IUser&gt;response界面
  • 你的意思是map(response =&gt; return &lt;IHero&gt;response),那么username如何映射到name呢?在这个简单的例子中,这基本上就是我的问题。

标签: javascript json angular httpclient observable


【解决方案1】:

你给自己添了太多麻烦。

export interface IUser {
  id: number;
  username: string;
  email: string;
}

getUsers(): Observable<User[]> {
  return this.http.get<User[]>('http://localhost:8000/users/')
    .catch(err => this.handleError('getUsers', []));
} 

你去,你的回复是输入的。

将 Typescript 视为开发帮助。在编码过程中拥有类等非常有用,但是一旦构建了应用程序,它就会全部编译为 Javascript,从而“丢失”所有类和属性。

你不应该想太多。只需选择最简单的,它应该可以工作。否则,你仍然有一个 TS linter 来告诉你你的错误在哪里!

【讨论】:

  • 嗯,这是一个非常简单的例子,因为它是一个在 FE 上具有不同属性名称的更复杂的东西。但是,我理解并同意您的看法。我正在寻找这种映射的最佳实践实施。
  • 没有“映射的最佳实践实现”:当您必须更改数据时使用映射。如果您需要在每次调用时映射您的响应以适应您的模型,那么更改您的模型以适应您的响应模型。只需使用get&lt;Type&gt; 键入您的呼叫,并使用Observable&lt;Type&gt; 键入您的函数。否则,您不需要像以前那样实例化新元素。这是在浪费时间、资源和代码行数。
猜你喜欢
  • 2021-07-24
  • 2023-03-16
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多