Angular httpClient映射对具有行为的实体的响应

时间:2019-03-20 16:30:07

标签: angular typescript httpclient

我正在尝试将GET请求的响应映射到实体类。 在该响应对象上调用函数时,将引发错误:

  

TypeError:res.foo不是函数

获取请求:

 this.http.get<TodoEntity>('https://jsonplaceholder.typicode.com/todos/1').subscribe((res) => {
    console.log(res.foo());
  })

实体类:

export class TodoEntity {
 public userId: number;
 public id: number;
 public title: string;
 public completed: boolean;
 public foo(): string {
    return 'Hello world';
 }
}

是否可以将响应直接映射到实体类并在其上调用函数?还是我必须基于响应对象手动创建 TodoEntity 的新实例?

我正在使用带角度7.3.6的打字稿3.1.6。

2 个答案:

答案 0 :(得分:3)

您需要创建该类的实例。当您将JSON转换为原型JavaScript / TypeScript类时,这些方法不可用。

编辑: 刚刚在这里找到了很好的解释: https://stackoverflow.com/a/22875957/894532

答案 1 :(得分:1)

您可以使用RxJS的map运算符,使用Object.assign根据网络服务返回的属性集来构建TodoEntity实例:

this.http.get('https://jsonplaceholder.typicode.com/todos/1').pipe(
  map(res => Object.assign(new TodoEntity(), res))
).subscribe((res: TodoEntity) => {
  console.log(res.foo());
});

演示:https://stackblitz.com/edit/angular-igaw2q