我希望你能帮助我。 我有一个我创建的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}
任何人都可以帮助我,以便摆脱打字稿错误吗?
非常感谢, 利诺
答案 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,因此您可以为响应设置任何类型或创建界面。