2017-10-19 31 views
0

我有一个表示从API返回的数据结构的类。我添加了一些便利方法,它们将逻辑应用于这些字段以返回计算值。将HttpResponse强制转换为指定类型的项目,并使用自定义方法完成

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

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

这是因为如果该对象未实例化类项目的实例,它只是验证,你从来没有把它当作什么,但一个项目。所以,在类定义中定义的所有函数都不会附加到对象上。

有没有办法不只是类型检查,而是强制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; 
    }); 

以及创建项目的数组。好极了!问题解决了!谢谢@DeborahK

回答

1

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

在你.subscribe,你可以做这样的事情:

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

哪里Item是你的类和data的名字是从HTTP请求回来的数据。

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

如果你想提供更多的代码,我可以提供一个更具体的例子。

+0

不幸的是,这似乎并没有奏效。为了增加清晰度,我将用我试过的代码更新这个问题。 –

+0

得到它的工作!感谢您的帮助 –

相关问题