“响应”类型的参数不可分配给“字符串”类型的参数
Posted
技术标签:
【中文标题】“响应”类型的参数不可分配给“字符串”类型的参数【英文标题】:Argument of type 'Response' is not assignable to parameter of type 'string' 【发布时间】:2017-10-29 06:06:58 【问题描述】:我正在处理这个项目。 这个想法是使用 Angular 4 从谷歌图书 API 中检索图书
我正在努力理解如何阅读 JSON 响应,我仍在学习 Angular。 我在网上搜索,在 GitHub 上找到了这个源代码 google bookstore
我收到以下错误
Argument of type 'Response' is not assignable to parameter of type 'string'.
对于这一行
let bookResponse = JSON.parse(body);
我不确定我是否以正确的方式进行操作。 感谢您的帮助
以下是我发送 HTTP 请求的方法。
getBooks(searchparam: any)
let par = new HttpParams();
par.set('q', searchparam);
return this.httpClient.get('https://www.googleapis.com/books/v1/volumes',
params : new HttpParams().set('q',searchparam)
).map(
(response: Response) =>
let data = response;
return data;
);
以下是从HTTP请求中获取数据并读取JSON响应的方法
getBook()
const dataArrya = this.searchForm.get('param').value;
console.log(dataArrya);
this.requestService.getBooks(dataArrya)
.subscribe(
response =>
this.printData(response)
// console.log(this.bookData);
,
(error) => console.log(error)
);
private printData(res: Response)
let body = res;
let books: Array<Book> = new Array<Book>();
let bookResponse = JSON.parse(body);
console.log(bookResponse);
console.dir(bookResponse);
for (let book of bookResponse.items)
books.push(
title:book.volumeInfo.title,
subTitle: book.volumeInfo.subTitle,
categories: book.volumeInfo.categories,
authors: book.volumeInfo.authors,
rating: book.volumeInfo.rating,
pageCount: book.volumeInfo.pageCount,
image: book.volumeInfo.imageLinks === undefined ? '' : book.volumeInfo.imageLinks.thumbnail,
description: book.volumeInfo.description,
isbn: book.volumeInfo.industryIdentifiers,
previewLink: book.volumeInfo.previewLink
);
【问题讨论】:
对了,上面的代码有错误。 HttpParams 实例是不可变的,.set
应该链接到 ***.com/questions/45210406/… 。这个par.set('q', searchparam)
不起作用。
感谢 Estus,它对我有用,因为我只有一个参数,但如果我有更多,那就是个问题。
之所以有效,是因为您在另一个地方有正确的代码,params : new HttpParams().set('q',searchparam)
【参考方案1】:
JSON.parse
接受一个字符串,但您传递给它的是一个 Angular Response
,它是一个对象(不是字符串)。要将 Angular Response
转换为字符串,您可以在其上调用 toString
,如下所示:
let bookResponse = JSON.parse(body.toString());
【讨论】:
谢谢谢谢【参考方案2】:正如the reference 所说,
responseType 值决定了如何解析成功的响应正文。如果 responseType 是默认的 json,则结果对象的类型接口可以作为类型参数传递给 request()。
HttpClient
get
已经默认解析了JSON.parse
的响应,不需要调用两次。
结果是普通对象,而不是Response
(它属于Http
API,在不导入时可能与Response
global混淆)。
提到的repository 使用Angular 2 和Http
,那里的代码不适合这里。 HttpClient
是 Angular 4 中引入的更新 API。Http
和 HttpClient
之间的主要实际区别在于后者不需要在请求中添加 .map(response: Response => response.json())
。
【讨论】:
请帮我***.com/questions/57214946/…以上是关于“响应”类型的参数不可分配给“字符串”类型的参数的主要内容,如果未能解决你的问题,请参考以下文章
构建:'string | 类型的参数1' 不可分配给“字符串”类型的参数
“字符串”类型的参数不可分配给“$string”类型的参数 | `$string.$string` | `$string.$number`'
打字稿:“RegExpMatchArray”类型的参数不可分配给“字符串”类型的参数
NestJS Postgres Prisma - 错误类型'字符串'不可分配给参数类型'TemplateStringsArray | Sql'