“响应”类型的参数不可分配给“字符串”类型的参数

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()。

HttpClientget已经默认解析了JSON.parse的响应,不需要调用两次。

结果是普通对象,而不是Response(它属于Http API,在不导入时可能与Response global混淆)。

提到的repository 使用Angular 2 和Http,那里的代码不适合这里。 HttpClient 是 Angular 4 中引入的更新 API。HttpHttpClient 之间的主要实际区别在于后者不需要在请求中添加 .map(response: Response =&gt; response.json())

【讨论】:

请帮我***.com/questions/57214946/…

以上是关于“响应”类型的参数不可分配给“字符串”类型的参数的主要内容,如果未能解决你的问题,请参考以下文章

构建:'string | 类型的参数1' 不可分配给“字符串”类型的参数

“字符串”类型的参数不可分配给“$string”类型的参数 | `$string.$string` | `$string.$number`'

打字稿:“RegExpMatchArray”类型的参数不可分配给“字符串”类型的参数

NestJS Postgres Prisma - 错误类型'字符串'不可分配给参数类型'TemplateStringsArray | Sql'

Angular 5 错误 TS2345:“数字”类型的参数不可分配给“字符串”类型的参数

打字稿错误 TS2345 错误:TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数