类型 '() => Observable<any>' 不可分配给类型 '() => Observable<any>'

Posted

技术标签:

【中文标题】类型 \'() => Observable<any>\' 不可分配给类型 \'() => Observable<any>\'【英文标题】:Type '() => Observable<any>' is not assignable to type '() => Observable<any>'类型 '() => Observable<any>' 不可分配给类型 '() => Observable<any>' 【发布时间】:2017-08-12 12:32:03 【问题描述】:

我正在使用 typescript 制作一个 ionic 2 应用程序,在将本地 typescript 安装从版本 2.1.0 升级到版本 2.2.1 后,我开始收到此错误:

类型 '() => Observable' 不可分配给类型 '() => 可观察”。两种不同的类型 此名称存在,但它们无关。类型“Observable”不可分配给类型“Observable”。 存在同名的两种不同类型,但它们不相关。

以下每一行都会重复此错误

L28:  this.onDisconnect = Network.onDisconnect
L29:  this.onchange = Network.onchange
L30:  this.ontypechange = Network.ontypechange

Network 是从ionic-native 导入的类,其onDisconnectonchangeontypechange 方法定义如下:

static onDisconnect(): Observable<any>;
static onchange(): Observable<any>;
static ontypechange(): Observable<any>;

我有 onDisconnectonchangeontypechange 作为名为“网络”的自定义类(@Injectable() 类)的 public 属性,我将它们定义如下:

L15:  public onDisconnect: ()=>Observable<any>
L16:  public ontypechange: ()=>Observable<any>
L17:  public onchange: ()=>Observable<any>

我有三个问题?

第一:有人能帮我理解这个错误在打字稿中的真正含义以及为什么它会在我的代码中出现。

第二:虽然我知道我可以扩展类,但我不想这样做。所以我要问,将我的方法声明为public 而类中的方法是static 的区别会导致这个问题吗?

第三:这两种在类上定义属性有什么区别?

编辑:

我刚刚意识到我之前尝试过扩展 Network 类,但由于静态声明而失败

【问题讨论】:

【参考方案1】:

由于某个版本的 RxJS 和 Ngrx v7 不兼容,我遇到了类似的错误。将 RxJS 降级到 ~6.4.0 有帮助。我运行yarn add rxjs@~6.4.0 为我工作,错误已解决。

【讨论】:

【参考方案2】:

这对我有用:

import Observable rxjs/observable 更改为 import Observable rxjs;

【讨论】:

我一定会试试这个 我认为这不是一个好主意。它将大大增加您的生产构建的包大小。【参考方案3】:

node_modules 树中潜伏着两个不同版本的 rxjs,而 TS 不知道它们是“相同的”。

首先要尝试清除整个node_modules 目录,刷新npm 缓存,然后重做npm install

如果这不能解决问题,则根本问题可能是不同的依赖项指定了不兼容的 rxjs 版本,迫使 npm 为其中一个或多个引入单独的 rxjs 版本(它将放置在node_modules 目录 一些模块)。你会看到这样的结构

node_modules
  dependencyA
  rxjs
  dependencyB
    node_modules
      rxjs

如果发生这种情况,那么您将别无选择,只能追踪有问题的版本要求。例如,***package.json 可能有rxjs: "^5.2.0",而dependencyB/package.json 可能有rxjs: "5.0.0"

【讨论】:

现在试试这个。您是说我编写代码的方式没有问题吗?我将如何做你的建议? npm prune?加上我的包,json有"rxjs": "5.0.0-beta.12" 不,您的代码应该没有问题。要清理 node_modules,请在您的操作系统中运行 rm -rf node_modules &amp;&amp; npm cache clean 或等效项。尝试用"rxjs": "^5.0.0" 替换package.json 中的依赖项。名称中带有 beta 的版本不能很好地与 semver 匹配策略配合使用。如果一切都失败了,你可以试试"rxjs": "5.0.0-beta.12 || &gt;=5.0.0" 这并不能解决我的问题。我认为这是与打字稿有关的事情。升级全局打字稿后立即开始 恢复到 typescript v2.0.9 之前已经解决了我的问题。但这仍然引出了一个问题,我的打字有什么问题? 如果 2.0.9 有效而 2.2.1 无效,请务必在 github.com/Microsoft/TypeScript 提交问题,让团队尽快知道。

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

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

类型 'Observable<ArrayBuffer>' 不可分配给类型 'Observable<HttpResponse<User>>'

错误 TS2416 类型 'Observable<APIResponse>' 不可分配给类型 'Observable<User>'

Observable<> 不可分配给类型 Observable<SomeType[]>

无法将 Observable<Store> 类型的类型值转换为预期的参数类型 Observable<Store?>

如何组合多个 Observable 类型数组 Observable<T[]>?