如何解决 TypeScript 2.4 和 RxJS 5.x 中的“主题不正确地扩展 Observable”错误?

Posted

技术标签:

【中文标题】如何解决 TypeScript 2.4 和 RxJS 5.x 中的“主题不正确地扩展 Observable”错误?【英文标题】:How do I get around this "Subject incorrectly extends Observable" error in TypeScript 2.4 and RxJS 5.x? 【发布时间】:2017-12-02 06:33:22 【问题描述】:

编译时,在 RxJS 声明文件中出现以下编译器错误:

node_modules/rxjs/Subject.d.ts(16,22): error TS2415: Class 'Subject<T>' incorrectly extends base class 'Observable<T>'.
  Types of property 'lift' are incompatible.
    Type '<R>(operator: Operator<T, R>) => Observable<T>' is not assignable to type '<R>(operator: Operator<T, R>) => Observable<R>'.
      Type 'Observable<T>' is not assignable to type 'Observable<R>'.
         Type 'T' is not assignable to type 'R'.

这里发生了什么,如何在不降级到 TypeScript 2.3 或更早版本的情况下解决这个问题?

【问题讨论】:

【参考方案1】:

解决方案

RxJS 5.4.2 现在应该与 TypeScript 2.4.1 完美配合。 如果可能,只需升级到 5.4.2+。

npm install --save rxjs@^5.4.2

如果您没有立即看到更改,请尝试重新启动编辑器和/或重新编译。

如果没有,下面的解决方案应该可以工作。

为什么会这样

TypeScript 2.4 有一个严格的变化,Subject&lt;T&gt; 没有提升到正确的Observable。签名真的应该是

<R>(operator: Operator<T, R>) => Observable<R>

这将在 RxJS 6 中修复。

替代解决方案

较新版本的 RxJS 将修复此问题,但作为临时解决方法,您可以使用 noStrictGenericChecks 编译器选项。

tsconfig.json中,放入"compilerOptions",设置为true


    "compilerOptions": 
        "noStrictGenericChecks": true
    

在命令行上是--noStrictGenericChecks

【讨论】:

我在哪里使用这个“--noStrictGenericChecks”? 您的tsconfig.json 中的compilerOptions。只需删除破折号并将其设置为true 你能帮我解决这个问题吗?***.com/questions/44817801/…。这发生在我认为我的打字稿更新到 2.4.1 时。 除了我的 typescript 2.4.0 运行时对 noStrictGenericChecks 选项一无所知.. 并且尝试设置它会导致错误.. 非常感谢您的回答。 npm install --save rxjs@^5.4.2 解决了我的问题。【参考方案2】:

我在 package.json 文件中做了以下两个改动。

1) 在依赖项部分将 rxjs 版本更改为 5.4.1。

“依赖”: “rxjs”:“5.4.1”

2) 在 devDependencies 部分将 typescript 版本更改为 2.4.0。

“开发依赖”: “打字稿”:“2.4.0”

在进行两项更改后,我运行了“npm install”命令,它成功了。

【讨论】:

【参考方案3】:

今天,遇到了这个错误,并通过以下三个步骤实际解决了这个问题。因此,与希望分享相同的内容,这将对其他人有所帮助。

第 1 步: 在 package.json 文件中将条目更改为“rxjs”:“5.4.2”,

第 2 步: 从项目中删除 node_modules 文件夹,该文件夹位于根目录中

第 3 步: 现在,右键单击 package.json 文件并单击恢复,如下图所示:

注意:它将再次使用新文件创建node_module文件夹,现在构建解决方案,希望您不会遇到与上述问题相关的任何构建错误。

【讨论】:

为我解决了这个问题。你会认为官方 Angular 网站上的教程会与最新版本保持同步,但事实并非如此。 是的,你是对的,很高兴它解决了你的问题@breez。快乐分享..:)【参考方案4】:

我在 package.json 文件中进行了以下更改。

 "dependencies": 
    "@angular/animations": "4.1.3",
    "@angular/common": "4.4.6",
    "@angular/compiler": "4.4.6",
    "@angular/compiler-cli": "2.4.8",
    "@angular/core": "4.4.6",
    "@angular/forms": "4.4.6",
    "@angular/http": "4.4.6",
    "@angular/platform-browser": "4.4.6",
    "@angular/platform-browser-dynamic": "4.4.6",
    "@angular/platform-server": "4.4.6",
    "@angular/router": "4.4.6",
    "@ionic/storage": "2.0.0",
    "cordova-plugin-console": "1.0.5",
    "cordova-plugin-device": "1.1.4",
    "cordova-plugin-splashscreen": "~4.0.1",
    "cordova-plugin-statusbar": "2.2.1",
    "cordova-plugin-whitelist": "1.3.1",
    "ionic-angular": "2.2.0",
    "ionic-native": "2.4.1",
    "ionic-plugin-keyboard": "~2.2.1",
    "ionic-tooltips": "^2.0.0",
    "ionicons": "3.0.0",
    "rxjs": "^5.4.2",
    "sw-toolbox": "3.4.0",
    "typescript": "2.4.0",
    "zone.js": "0.7.2"
  

rxjs 和 typescript 版本的变化。

【讨论】:

【参考方案5】:

在您的主题课程中:

改变这一行:

lift<R>(operator: Operator<T, R>): Observable<T>;

到:

lift<R>(operator: Operator<T, R>): Observable<R>;

【讨论】:

【参考方案6】:

添加

"noStrictGenericChecks": true

在 tsconfig.json 文件中

【讨论】:

【参考方案7】:

这是 rxjs 和 typscript 之间的不匹配问题,使用 "rxjs": "5.4.2" 和 "typescript": "~2.3.4" 对我有用

【讨论】:

【参考方案8】:

我遇到了同样的问题,发现以下网站很有帮助 https://www.georgephillipson.com/blog/jquery/setting-up-angular-2-in-visual-studio-2017/ 它有关于为 MVC 网站设置 Angular 的分步说明,解释了如何修复这篇文章所指的错误以及指向 GitHub 的链接带有完整的代码。

我觉得它很有帮助,所以我想我会让其他人知道

根据 Zoes 的帖子,我添加了更多关于我认为该链接可能有用的原因

该页面展示了如何更新 RxJS 以修复错误,它还展示了如何检查您的计算机上是否安装了 Node 和 NPM,并解释了如何添加 TypeScript,然后展示了如何设置您的 cshtml 文件以显示角度内容

【讨论】:

欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.【参考方案9】:

在tsconfig.json中,放入“compilerOptions”并设置为true。


    "compilerOptions": true,
    "compilerOptions": 
        "noStrictGenericChecks": true
    

【讨论】:

以上是关于如何解决 TypeScript 2.4 和 RxJS 5.x 中的“主题不正确地扩展 Observable”错误?的主要内容,如果未能解决你的问题,请参考以下文章

第1009期TypeScript 2.4 新特性一览

有没有办法禁用 Typescript 2.4 版引入的弱类型检测?

Ubuntu 已登陆 Windows Store;微软发布了 TypeScript 2.4

资讯 | 王者荣耀:健康游戏不止于防沉迷;Java 9来了;TypeScript 2.4 发布

在 Node.js 和 Vue.js 之间共享 TypeScript 代码

如何解决“错误:TypeScript 编译中缺少 \src\main.ts”。