rxjs / Subject.d.ts错误:类'Subject <T>'错误地扩展了基类'Observable <T>'


89

我从本教程中提取了示例模板代码,并按照以下两个步骤进行了入门-

  1. npm install // worked fine and created node_modules folder with all dependencies
  2. npm start //失败,并出现以下错误-

    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 '<T, 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'.
      npm ERR! code ELIFECYCLE
      npm ERR! errno 2

我看到在抬升的subject.d.ts声明如下-

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

在Observable.ts中,它的定义如下:

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

注意:1.我是Angular2的新手,正在尝试掌握一切。

  1. 该错误可能是由于提升方法的定义不兼容

  2. 我阅读了这个github线程

  3. 如果我需要安装其他版本的rxjs,请说明如何卸载和安装正确的rxjs。

Edit1: 我在这里响应可能有点晚,但是即使使用打字稿2.3.4rxjs 6 alpha,我仍然会遇到相同的错误。以下是我的package.json,

{
  "name": "angular-quickstart",
  "version": "1.0.0",
  "scripts": {
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ",
    "lite": "lite-server",
    "postinstall": "typings install",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "typings": "typings"
  },
  "license": "ISC",
  "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/router": "3.0.0",
    "@angular/upgrade": "2.0.0",
    "core-js": "^2.4.1",
    "reflect-metadata": "^0.1.3",
    "rxjs": "6.0.0-alpha.0",
    "systemjs": "0.19.27",
    "zone.js": "^0.6.23",
    "angular2-in-memory-web-api": "0.0.20",
    "bootstrap": "^3.3.6"
  },
  "devDependencies": {
    "concurrently": "^2.2.0",
    "lite-server": "^2.2.2",
    "typescript": "2.3.4",
    "typings": "^1.3.2"
  }
}



这似乎已在rxjs@5.4.2修复

Answers:


70

按照您需要更新打字稿2.3.4或rxjs 6 alpha

在项目更新Typescript或rxjs版本中转到您的package.json文件。例

"typescript": "2.3.4"

npm install

更新(06/29/2017):-

根据评论打字稿"2.4.0"工作。


6
"typescript": "^2.3.4"将匹配2.4.1,而2.4是暴露RxJS问题的版本。
Cartant

5
将打字稿版本替换为“ 2.4.0”对我有用。
Ajax

1
我第二个观点是它必须精确地是“ 2.3.4”-“ ^ 2.3.4”对我不起作用。
maia

1
的结合"typescript": "2.3.0""rxjs": "5.4.1"为我工作
ericdemo07年7

@Jonnysai对不起,我收回了我所说的话。项目已编译,但出现运行时错误,并降级为2.3.4。此处更多信息:stackoverflow.com/a/44556137
Carcamano

25

正如其他人指出的那样,此问题是由于TypeScript 2.4中引入的更严格的泛型类型检查导致的。这暴露了RxJS类型定义中的不一致,因此已在RxJS版本5.4.2修复因此,理想的解决方案是仅升级到5.4.2。

如果由于某种原因您无法升级到5.4.2,则应改用Alan Haddad的解决方案,即增加类型声明以为您自己的项目修复它。即将此代码段添加到您的应用程序:

// TODO: Remove this when RxJS releases a stable version with a correct declaration of `Subject`.
import { Operator } from 'rxjs/Operator';
import { Observable } from 'rxjs/Observable';

declare module 'rxjs/Subject' {
  interface Subject<T> {
    lift<R>(operator: Operator<T, R>): Observable<R>;
  }
}

他的解决方案将不会留下任何其他副作用,因此非常出色。另外,建议的解决方案对您的项目设置有更多的副作用,因此不太理想:

  • 使用编译器标志关闭更严格的通用检查--noStrictGenericChecks。但是,这将降低对您自己的应用程序的严格程度,您可以执行此操作,但可能会引入不一致的类型定义,就像在此RxJS实例中所做的那样,从而可能在您的应用程序中引入更多错误。
  • 不检查将标志--skipLibCheck设置为true的库中的类型。这也不理想,因为您可能不会报告某些类型错误。
  • 升级到RxJS 6 Alpha-鉴于存在重大更改,这可能会以不良记录的方式破坏您的应用程序,因为它仍处于Alpha状态。另外,如果您还有其他依赖项(例如Angular 2+),则可能不是真正受支持的选项,请立即中断框架本身或将其中断。我认为这是一个更难解决的问题。

24

允许使用的创可贴方法是将以下内容添加到tsconfig.json文件中,直到RxJS伙计们决定使用TypeScript 2.4.1时要对错误进行处理:

"compilerOptions": {

    "skipLibCheck": true,

 }

谢谢你,它成功了。我尝试了很多其他事情,但我猜这个错误与错误的软件包有关,而错误的版本相互不支持...
Salim

2
我认为禁用或禁止All LibCheck并不是一个好主意。
CharanRoot17年


@Jonnysai,因为您不拥有该代码,因此在短期内抑制lib检查是可以的,因为您可以提交与库有关的问题,然后继续自己的开发工作。您可以提交自己的问题并链接到他们的问题,当它们的类型固定后,您可以取消压制。
肖恩·纽厄尔

6
真正的解决方案应该不会skipLibCheck。如果这样做,可能会给其他问题带来麻烦。更好的解决方案是noStrictGenericChecks直到更新RxJS。
Daniel Rosenwasser

19

您可以使用模块增强来临时解决此问题。

以下代码为我解决了该问题。一旦RxJS的稳定版本不出现此问题,应将其删除。

// augmentations.ts
import {Operator} from 'rxjs/Operator';
import {Observable} from 'rxjs/Observable';

// TODO: Remove this when a stable release of RxJS without the bug is available.
declare module 'rxjs/Subject' {
  interface Subject<T> {
    lift<R>(operator: Operator<T, R>): Observable<R>;
  }
}

尽管具有讽刺意味的是,RxJS本身大量使用了这种技术来描述其自身的形状,但实际上它通常适用于一系列问题。

尽管肯定有限制和粗糙的边缘,但是使此技术强大的部分原因在于,我们可以使用它来增强现有的声明,从而使它们在不分叉和维护整个文件的情况下更加安全。


您在哪里添加或导入此文件?
戴夫

1
将其添加到项目中的任何位置,以便编译器将其拾取。如果您使用的是显式文件列表,请确保已将其包括在内。否则,只要它不在tsconfig.json文件上方,它就应该自动被拾取
Aluan Haddad

2
我尝试过此操作,因为这似乎是最没有破坏性的操作。很好
史蒂芬·霍尔特

1
我想出了如何添加文件-“ import'rxjs / Subject';” (不带“大括号”或大括号)在app.component.ts中。
John Pankowicz

1
@JaredWhipple这是一个严重的问题,除了类型检查以外,还有其他影响。您可以使用"paths"in tsconfig.json显式指定类型检查的位置"rxjs"和位置"rxjs/*"。但是,具有多个版本可能会导致运行时问题。即使您不使用instanceof和进行其他类似的测试,您的部门也可能没有那么原则。最好的办法是打开videogular2的问题,建议将RxJS更改为对等依赖性。
Aluan Haddad

9
"dependencies": {
"@angular/animations": "^4.3.1",
"@angular/common": "^4.3.1",
"@angular/compiler": "^4.3.1",
"@angular/compiler-cli": "^4.3.1",
"@angular/core": "^4.3.1",
"@angular/forms": "^4.3.1",
"@angular/http": "^4.3.1",
"@angular/platform-browser": "^4.3.1",
"@angular/platform-browser-dynamic": "^4.3.1",
"@angular/platform-server": "^4.3.1",
"@angular/router": "^4.3.1",
"core-js": "^2.4.1",
"rxjs": "^5.4.2",
"ts-helpers": "^1.1.1",
"zone.js": "^0.7.2"
},
"devDependencies": {
"@angular/compiler-cli": "^2.3.1",
"@types/jasmine": "2.5.38",
"@types/node": "^6.0.42",
"angular-cli": "1.0.0-beta.28.3",
"codelyzer": "~2.0.0-beta.1",
"jasmine-core": "2.5.2",
"jasmine-spec-reporter": "2.5.0",
"karma": "1.2.0",
"karma-chrome-launcher": "^2.0.0",
"karma-cli": "^1.0.1",
"karma-jasmine": "^1.0.2",
"karma-remap-istanbul": "^0.2.1",
"protractor": "~4.0.13",
"ts-node": "1.2.1",
"tslint": "^4.3.0",
"typescript": "^2.3.4",
"typings": "^1.3.2"
}

在package.json "rxjs": "^5.4.2",“ typescript”:“ ^ 2.3.4”中,然后npm installng服务其工作。


8

为了给我两分钱,我只提供了一些细节。

当我们升级问题出现打字稿到最新版本,它现在是打字稿2.4.1,[“作为我们爱的升级:)”],并且提到的@ Jonnysai在他的回答和提供的链接有,有有关该问题及其修复的详细讨论。

那么,是什么工作对我来说是:
1。我不得不的Un安装 打字稿2.4.1首先,通过转到控制面板 > 程序和功能......
2.安装,重新,打字稿2.4.0,并确保在package.json文件中,你有这样的配置,提到这里在一个相当短的细节。 您可以从此处下载TypeScript 2.4.0用于Visual Studio 2015。

在此处输入图片说明



这非常简单,没有“解决方法”。我不确定这是否重要,但我的rxjs是“ 5.0.1”,但我没有更改,尽管一切都很好。感谢您的两美分-它帮助了我!
汤姆A

使用Typescript 2.3.4时我也遇到此问题。因此,由于升级到2.4.1出现问题似乎是不正确的。当前的angular-cli安装2.3.4,因为它说它要求<2.4.0。
John Pankowicz




3

添加“noStrictGenericChecks”:真正tsconfig.json下的文件“compilerOptions”节点如下图所示的图像和构建应用程序。添加此错误后,我遇到了同样的错误。 在此处输入图片说明


2

我发现同样的问题,我用它来解决“rxjs”:“5.4.1”“打字稿”:“〜2.4.0”,并加入“noStrictGenericChecks”:真正到tsconfig.json。


1

RxJS 6将解决此问题,但是作为临时解决方法,您可以使用noStrictGenericChecks编译器选项。

在中tsconfig.json,将其放入compilerOptions并设置为true。

{
    "compilerOptions": {
        "noStrictGenericChecks": true
    }
}

在命令行上是--noStrictGenericChecks

发生原因:

TypeScript 2.4进行了严格性更改,并且Subject并未提升为正确的Observable。签名确实应该是

(操作员:操作员)=>可观察

这将在RxJS 6中修复。





0

现在我们不需要ionic-native模块-我们只需要@ ionic-native / core。跑

npm uninstall ionic-native --save

它将解决您的问题。



0

感谢zmag和Rahul Sharma的回答,它有效!@zmag @拉胡尔·夏尔马

  "rxjs": "5.4.1",
  "typescript": "~2.4.0"

我的问题如下:

typings/globals/core-js/index.d.ts:3:14 - error TS2300: Duplicate identifier

进行更改。

转到Package.json文件并修改以下配置

  "rxjs": "5.4.1",
  "typescript": "~2.4.0"

-3

是的,问题出在TypeScript 2.4.1上,我只是从“控制面板”中卸载了它,它对我有用,因为Visual Studio 2017已经有了这个。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.