如何转换http.get()响应,以便组件能够直接使用结果

时间:2019-04-11 11:01:13

标签: angular rxjs

我想转换数据获取的结果,以便组件可以使用它。

  • 响应作为对象返回。

  • 我需要投影对象的属性keywords,它包含对象数组:

interface GetKeywordsResponse {
   business : BusinessObj, 
   keywords : Array<KeywordObj>
}
  • 对于数组中的每个对象,我要投影属性keyword
interface KeywordObj {
 id: number,
 keyword: string
 }

给我一​​个字符串数组: //['foo', 'bar']

我知道我需要pipe()map()才能实现。但是我的解决方案是生成类型错误。

服务方法:

public getKeywords(): Observable<Array<string>>  {
    return this.http.get<Observable<GetKeywordsResponse>>(...url).pipe(
      map((res: GetKeywordsResponse): Array<KeywordObj> => res.keywords),
      map((res: KeywordObj): Array<string> => res.keyword )
  }

我希望该方法可以正常工作。但是我遇到两个错误:

1. Argument of type 'OperatorFunction<GetKeywordsResponse, KeywordObj[]>' is not assignable to parameter of type 'OperatorFunction<Observable<GetKeywordsResponse>, KeywordObj[]>'.
 Type 'GetKeywordsResponse' is missing the following properties from type 'Observable<GetKeywordsResponse>': _isScalar, source, operator, lift, and 6 more.

2. Type 'string' is not assignable to type 'string[]'.

如何修复getKeywords()?

1 个答案:

答案 0 :(得分:0)

public getKeywords(): Observable<string[]>  {
   return this.http.get(`${this.uri}/businesses/${this.businessId}/keywords`).pipe(
     map((res: GetKeywordsResponse): Array<KeywordObj> => res.keywords),
     map((arr: Array<KeywordObj>): string[] => arr.map((obj: KeywordObj): string => obj.keyword)))
 }
  • 第二张地图的输入返回一个对象数组。我误以为它是对象数组中的一个项目。