类型 'Observable<any>' 不可分配给类型 'Observable<T>'

Posted

技术标签:

【中文标题】类型 \'Observable<any>\' 不可分配给类型 \'Observable<T>\'【英文标题】:Type 'Observable<any>' is not assignable to type 'Observable<T>'类型 'Observable<any>' 不可分配给类型 'Observable<T>' 【发布时间】:2018-03-09 04:27:24 【问题描述】:

我有以下代码

import HttpClient from '@ngular/common/http';

private httpClient: HttpClient;

do_request(method: string,                                                           
        url: string,                                                              
        headers?: HttpHeaders,                                                
        content?: string,                                                         
        contentType?: string): Observable<MyResponse>                      

   let options =                                                                 
       observe: 'response' as 'response',                                         
       responseType: 'text' as 'text',                                             
       headers: headers,
       body: content:                                                                           
   

   return this.httpClient.request(method, url, options)                           
            .map(res=> new MyResponse(res.status, res.body))                
            .catch(err=>Observable.throw(new MyResponse(err.status)));                     
      

这段代码给了我以下错误

错误 TS2322:类型“Observable”不可分配给类型“Observable”。属性“源”受保护,但类型“Observable”不是从“Observable”派生的类

我正在使用 Rxjs 5.4.3、Angular 4.4.3 和 TypeScript 2.5.3。

我发现了几个可能的错误来源并尝试了建议的解决方案,但没有成功:

Typescript version(我降级到2.3,结果相似) 导入一个也依赖于 rxjs using npm link 的包(我在本地安装,结果相同)。

对于如何解决此问题的任何建议,我将不胜感激。

【问题讨论】:

如果删除catch块会发生这种情况吗? @Meir 错误更改:类型“Observable”不可分配给类型“Observable”。存在具有此名称的两种不同类型,但它们不相关。我删除了代码中的重复依赖项(正如我在问题中解释的那样)。但这可能与我使用新的 angular/common/http 模块有关 【参考方案1】:

根据您的评论,我认为您应该明确输入类型,因此,导入 Observable 并声明类型:

return this.httpClient.request(method, url, options)                           
        .map((res): MyResponse => new MyResponse(res.status, res.body))                
        .catch((err):Observable<MyResponse> => Observable.throw<MyResponse>(new MyResponse(err.status)));

重要的部分是throw(以及from和其他运算符)可以输入,语法是`Observable.operator(operands...)

【讨论】:

显然这解决了问题,但现在我有错误:类型'Observable'不可分配给类型'Observable'。存在具有此名称的两种不同类型,但它们不相关。属性 'source' 受到保护,但类型 'Observable' 不是从 'Observable' 派生的类我想这与某些依赖于 rxjs 的包有关。在确认解决方案之前,我需要验证这一点。谢谢 你不能对新的错误应用相同的解决方案吗? 显然,这个新错误是因为我导入了 rxjs 两次。我期待这会在某个时候发生,我针对该问题提出了另一个问题。

以上是关于类型 'Observable<any>' 不可分配给类型 'Observable<T>'的主要内容,如果未能解决你的问题,请参考以下文章

类型 '() => Observable<any>' 上不存在属性 'subscribe'

类型 '[]' 不可分配给 ionic 2 中的类型 'Observable<any[]>'

“MonoTypeOperatorFunction<any>”类型的参数不可分配给“UnaryFunction<Obs​​ervable<any>, Observable

错误 TS2339: 类型 'Observable<HttpEvent<any> 上不存在属性 'do'

如何将空 JSON 数据推送到 Observable<any[]> angular 2 类型的数组字段

rxswift:如何获取 Observable<Any> 导致 Observable<[Category]> 的组合?