【问题标题】:Error in stateless observable service: Type 'Observable<Course[]>' is not assignable to type 'Observable<Course>'无状态可观察服务中的错误:类型 'Observable<Course[]>' 不可分配给类型 'Observable<Course>'
【发布时间】:2021-10-20 16:23:06
【问题描述】:

我正在学习 rxjs,但遇到了这个错误。

我有以下方法

  getCourseById(id: number): Observable<Course> {
    return this.http.get<Course[]>('the-api').pipe(
      map(courses =>
          courses.filter(course => course.id === id)
        )
    )
  }

我调用特定的 API 端点,获取整个响应,然后使用 map 过滤该集合并获取 id 等于参数 id 的课程。

该函数返回一个 Course 类型的 Observable。

然而,在控制台中我看到:

error TS2322: Type 'Observable<Course[]>' is not assignable to type 'Observable<Course>'.
  Type 'Course[]' is missing the following properties from type 'Course': id, name, url, description

 27     return this.http.get<Course[]>('the-api').pipe(
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 28       map(courses =>
    ~~~~~~~~~~~~~~~~~~~~~
... 
 30         )
    ~~~~~~~~~
 31     )
    ~~~~~

我不知道如何解决它。 我会很感激帮助。 谢谢

【问题讨论】:

  • 您告诉HttpClient 获取Course 项目的数组,具有指示单个实例是返回的方法签名,并且您永远不会将获取的数组转换为单个Course 元素.

标签: javascript angular rxjs


【解决方案1】:

您应该使用Array.find() 而不是Array.filter()。这只会返回匹配的对象:

getCourseById(id: number): Observable<Course> {
    return this.http.get<Course[]>('the-api').pipe(
      map(courses =>
          courses.find(course => course.id === id)!
        )
    )
}

【讨论】:

  • 谢谢,托拜厄斯。如果我使用 filter() 并使用 [0] 获取第一个元素。如果我在您的回答中使用 find() ,我会收到另一个错误。输入'可观察的' 不能分配给类型 'Observable'。键入“课程 | undefined' 不能分配给类型 'Course'。类型“未定义”不可分配给类型“课程”。
  • 是的,打字稿不知道您的情况下的 find 方法总是会找到一些东西,因此它将 undefined 添加为可能的返回类型。如果您不希望这样,您可以在查找后添加!。这将强制 typescript 知道结果不会是未定义的。
  • 非常感谢,托比亚斯!
猜你喜欢
  • 2020-01-10
  • 2019-02-07
  • 2019-12-25
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2019-01-10
  • 2020-01-15
相关资源
最近更新 更多