回复[ts]财产'身体'类型' {}'上不存在

时间:2018-06-14 07:45:47

标签: angular typescript http

我希望你能帮助我。 我有一个我创建的http.get方法:

return this.http
      .get(url)
      .map((response: Response) => {
        response = response.json(); //
        console.log('The http get response', response);
        return response;
      })
      .catch(this.handleError);

响应如下:

{Body: "[{"Id":1,"Name":"Tomato Soup","Category":"Grocerie…e":"Hammer","Category":"Hardware","Price":16.99}]"}

我的http.get的订阅方法如下所示:

this.azureService.messageBody.subscribe(
      (response: Response) => {
        this.msgBodyDetail = JSON.parse(response.Body);
      }

msgBodyDetail声明为string类型。 这行中有一个打字稿错误抱怨响应。身体:

this.msgBodyDetail = JSON.parse(response.Body);

The error is : [ts] Property 'Body' does not exist on type 'Response'.
any

应用程序不会出错,输出也是预期的。

console.log('Response', JSON.parse(response.Body));

结果:

Response: 
0 : {Id: 1, Name: "Tomato Soup", Category: "Groceries", Price: 1}
1 : {Id: 2, Name: "Yo-yo", Category: "Toys", Price: 3.75}
2 : {Id: 3, Name: "Hammer", Category: "Hardware", Price: 16.99}

任何人都可以帮助我,以便摆脱打字稿错误吗?

非常感谢, 利诺

2 个答案:

答案 0 :(得分:1)

我想添加@Amit的回答向您解释为什么您遇到此问题。

.map((response: Response) => {
    response = response.json(); //
    console.log('The http get response', response);
    return response;
})

如您所见,您声明了response类型的参数Response

因为您没有指定函数返回的内容,所以它会使用Response推断返回类型,因为您将返回重新分配的参数。由于它是Angular类,因此它没有Body成员。

当您编写response['Body']时,您使用数组表示法,它会删除键入和访问器:这就是您的错误消失的原因。

但这是一种解决方法,而不是一个干净的解决方案。

您应该做的是输入您的功能,并返回正确的类型。你可以这样做:

messageBody(): Observable<{Body: any[]}> { // You can replace any with a class if you have one
return this.http
  .get(url)
  .map((response: Response) => {
    console.log('The http get response', response);
    return response.json();
  })
  .catch(this.handleError);
}

答案 1 :(得分:0)

由于您将响应映射到response.json();,因此无法将其设置为在订阅中再次键入Response。

json();方法返回any,因此您可以为响应设置任何类型或创建界面。