0

我有一个代表从 API 返回的数据结构的类。我添加了几个方便的方法,它们将逻辑应用于这些字段以返回计算值。

当我使用 HttpClient 请求数据,然后尝试与那些便捷方法进行交互时,它不起作用。我收到一个错误:

TypeError: item.<method> is not a function. (In 'item.<method>()', 'item.<method>' is undefined)

就好像该对象没有被实例化为类 Item 的实例,只是验证了您从不将它用作除 Item 之外的任何东西。因此,类定义中定义的所有函数都没有附加到对象上。

有没有一种方法不仅可以进行类型检查,还可以强制 JSON 成为 Item 类型的实际对象?

我想我可以添加一个构造函数来获取通用对象并将所有字段复制到新对象的字段中。但这不仅看起来效率极低,而且散发着代码气味。

有没有一种干净的方法来获取从 HttpClient/HttpResponse 返回的对象以包含这些便利功能?

我尝试Object.assign()按照@DeborahK 的建议使用:

return this.http.get<Item[]>(`${this.apiUrl}/view/projects`, this.options)
  .map( (response: HttpResponse<Item[]>) => {
    var result = Object.assign(new Array<Item>(),response.body);
    console.log( result );
    return result;
  }); 

写入控制台的是一个数组,它包含所有数据,但没有一个元素是项目。可能是因为我没有创建项目数组,而是创建了一个应该包含项目的数组。

所以我像这样修改它:

return this.http.get<Item[]>(`${this.apiUrl}/view/projects`, this.options)
  .map( (response: HttpResponse<Item[]>) => {
    var result = response.body.map( (item:Item) => 
      Object.assign(new Item(),item) );
    console.log( result );
    return result;
  });

这会创建一个 Items 数组。耶!问题解决了!谢谢@DeborahK

4

1 回答 1

2

HttpClient 在布局中提供与提供的类或接口匹配的数据,但正如您所见,它实际上并没有创建类本身的实例。

在您的 .subscribe 中,您可以执行以下操作:

Object.assign(new Item(), data);

Item您的班级名称在哪里,并且data是从 http 请求返回的数据。

这将创建您的类的新实例并将返回的数据分配给该实例。

如果您想提供更多代码,我可以提供更具体的示例。

于 2017-10-19T21:14:59.157 回答