来自 rxjs5 的 Rxjs6:在 REST API 方法中处理 Observable

Rxjs6 from rxjs5: Handling Observables in REST API method

我是 rxjs 和 Angular 的新手,我刚刚发现(感谢我的 WebStorm 给我大量的红色错误消息)rxjs5 与版本 6 有很大不同。

所以我正在关注这个 tutorial,它指导用户使用 rxjs 组装 API 服务。问题是,它是为版本 5 编写的。

这是一个示例 API 路由 版本 5:

public getAllTodos(): Observable<Todo[]> {
  return this.http
   .get(API_URL + '/todos')
   .map(response => {
     const todos = response.json();
     return todos.map((todo) => new Todo(todo));
   })
   .catch(this.handleError);
}

阅读文档后,我将 版本 6 路由重写到此:

public getAllTodos(): Observable<Todo[]> {
  return this.http
   .get(API_URL + '/todos')
   .pipe(
     map(response => {
      return response.map((todo) => new Todo(todo));
     }),
     catchError(this.handleError)
  );
}

问题是,我得到:

Property 'map' does not exist on type 'Object'.

我猜这与响应不是 json 格式有关,尽管响应似乎没有 .json() 方法。

出现错误的原因是,如果您没有指定 response 变量的类型,它会被假定为一个对象。由于 map 是一个数组函数,您需要将响应的类型指定为数组:

this.http.get<any[]>(...).pipe(...); // Preferred

或:

this.http.get(...).pipe(map((response: any[]) => ...)...);

请注意,您应该将上面的 any 替换为从 API 返回的实际类型(字符串、对象等)。