【问题标题】:Type 'Subscription' is missing the following properties类型“订阅”缺少以下属性
【发布时间】:2020-02-05 10:50:08
【问题描述】:

当我编写此代码时,IDE 显示错误。

我有一个组件调用 ngOnInit 中的服务来获取数据。服务调用另一个服务来获取一些数据并使用它来获取数据然后返回它。

组件:

ngOnInit() {
    const token = "abc";
    this.service.getContactPersons(token).subscribe(
      persons => this.contactPersons = persons
    );

  }

服务:

getContactPersons(token: string): Observable<ContactPerson[]> {
return this.tokenService.getParameters(token).pipe(
      switchMap((data: Params) => {
        return this.http.get<Properties>(
          this.baseUrl + `/abc/${data.param1}/properties/${data.param2}`
        );
      })
    ).subscribe((data: Properties) => data.contactPersons);
}

我遇到了这个错误:“类型 'Subscription' 缺少类型 'Observable' 的以下属性:_isScalar、source、operator、lift 和另外 6 个。”

【问题讨论】:

    标签: angular typescript observable


    【解决方案1】:

    您的函数getContactPersons 返回一个订阅,就像现在一样。 只需删除函数的 .subscribe((data: Properties) =&gt; data.contactPersons); 部分,它就可以解决问题。

    由于您要返回一个 Observable,因此您应该始终尝试仅传递 observable 本身或在 pipe() 内对其执行操作,并且只订阅一次,因为多个订阅可能会失控并导致内存泄漏,因此会给您的用户带来性能损失。

    【讨论】:

    • 当我删除订阅时,我得到“类型 'Observable' 不可分配给类型 'Observable'。”
    • 是的,我忘记了这一点。请参阅 mbojko 的答案以获取解决方案
    【解决方案2】:

    subscribe 不是then 的 rxjs 等价物。具体来说,有了 Promise,你可以做到 somePromise.then(doSomething).then(doSomethingElse),但你不能 someRxjsStream$.subscribe(doSomething).subscribe(doSomethingElse)。如果你想转换数据流,你应该使用几个可用的 rxjs 运算符之一,在你的情况下它是map

    getContactPersons(token: string): Observable<ContactPerson[]> {
        return this.tokenService.getParameters(token).pipe(
            switchMap((data: Params) => this.http.get<Properties>(
                `${this.baseUrl}/abc/${data.param1}/properties/${data.param2}`)),
            map((data: Properties) => data.contactPersons));
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2019-06-02
      • 1970-01-01
      • 2021-06-24
      • 2020-01-03
      • 2019-04-28
      • 1970-01-01
      • 2019-09-11
      • 2019-06-21
      相关资源
      最近更新 更多