【问题标题】:I get Error: Type 'Subscription' is not assignable to type 'Observable'我得到错误:类型“订阅”不可分配给类型“可观察”
【发布时间】:2018-10-12 10:04:59
【问题描述】:

在这里,我有两种方法可供使用。我是新手,所以我不确定 subscribe 方法是做什么的,但我只知道没有它我无法构建我的项目。如果我评论这两个函数,然后 ng 服务,然后取消评论,并让它刷新更改,它就可以工作。但我无法建立项目。如何更改代码,以免出现这些错误并成功构建项目?

public delete(patient: Patient): Observable<Patient> {
    return this.http.delete<Patient>(`${this.deleteOneUrl}/${patient.id}`).subscribe();
}

public addPatient(patient: Patient): Observable<Patient> {  
    return this.http.post<Patient>(this.addOneUrl, patient).subscribe();
}

src/app/patient.service.ts(30,3) 中的错误:错误 TS2322:类型“订阅”不可分配给类型“可观察”。 “订阅”类型中缺少属性“_isScalar”。 src/app/patient.service.ts(38,5): error TS2322: Type 'Subscription' is notassignable to type 'Observable'。

【问题讨论】:

  • 返回类型与实际返回的内容不匹配。理想情况下,您应该返回Observable。因此根本不需要subscribe()。然后可以从其他地方(最好是从另一个组件)观察(订阅)这两种方法。

标签: angular


【解决方案1】:

通过调用subscribe(),您将获得Subscription 对象而不是Observable(您只需调用delete/post 方法即可获得)。

要么将返回类型更改为Subscription,要么返回Observable(删除.subscribe())。

通常你应该从你的服务中返回 observable 并稍后订阅(在一些点击处理程序中,甚至在模板中)。通过在服务中订阅,会立即触发http调用,而返回observable是惰性的,稍后订阅时会触发http调用。

【讨论】:

  • 我已将返回类型更改为订阅。它在开发人员模式下工作,但我仍然无法成功运行“ng build -prod”,现在我收到一个错误:src/app/patients/patients.component.ts(28,41) 中的错误:错误 TS2551:属性“订阅”类型不存在“订阅”。您的意思是“取消订阅”吗? src/app/patient-detail/patient-detail.component.ts(33,41):错误 TS2551:“订阅”类型上不存在“订阅”属性。您的意思是“取消订阅”吗?所以程序运行良好,但编译器发现错误,我相信它无法构建产品。因为它的版本。
  • 当你返回Subscription时,你已经订阅了它背后的observable。错误是关于你试图再次调用它。
  • 这就像,如果我使用某种“抑制错误”它应该可以工作,但这是一个不受欢迎的解决方法。
  • 我会从您的服务中删除subscribe() 调用,并将返回类型保留为Observable
  • 生产构建的问题是使用 AoT,它在构建时会评估代码。该错误也存在于开发构建中,您只需要手动触发该代码(可能通过一些按钮单击)。
猜你喜欢
  • 1970-01-01
  • 2019-08-01
  • 2016-11-12
  • 1970-01-01
  • 2018-02-26
  • 2017-11-23
  • 2019-12-25
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多