rxjs / Subject.d.ts错误:Class'Subject <T>'错误地扩展了基类'Observable <T>'
我从https://github.com/gopinav/Angular-2-Tutorials中提取了示例模板代码,并采取以下两个步骤开始 –
npm install // worked fine and created node_modules folder with all dependencies
-
npm start
失败,下面的错误 –node_modules / rxjs / Subject.d.ts(16,22):错误TS2415:“主题”类错误地扩展了基类“可观察”。 财产“升降机”的types是不相容的。 types'(operator:Operator)=> Observable'不可赋值
键入'(operator:Operator)=> Observable'。 types“Observable”不可分配给“Observable”types。 types“T”不可分配给“R”types。 npm ERR! 代码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的新手,想要掌握一些东西。
-
这个错误可能是由于lift方法的不兼容定义造成的
-
我通过https://github.com/Microsoft/TypeScript/issues/2073阅读
-
如果我需要安装一些不同版本的rxjs,那么请告诉如何卸载并安装正确的rxjs。
编辑1:我可能在这里回应有点晚,但即使使用打字机2.3.4或rxjs 6阿尔法仍然得到相同的错误。 下面是我的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" } }
按照这个你需要更新打字稿2.3.4或rxjs 6阿尔法
去你的项目更新打字稿或rxjs版本的package.json文件。 例
"typescript": "2.3.4"
做npm install
更新(2017年6月29日): –
根据评论打字稿"2.4.0"
工作。
正如其他人指出的那样,这个问题是由TypeScript 2.4中引入的generics的更严格的types检查造成的。 这暴露了RxJStypes定义中的不一致性,因此在RxJS 5.4.2版中得到修复。 所以理想的解决scheme就是升级到5.4.2。
如果由于某种原因无法升级到5.4.2,则应该使用Alan Haddad的解决scheme来扩充types声明,以便为自己的项目进行修复。 即添加此片段到您的应用程序:
// 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>; } }
他的解决scheme不会有其他的副作用,因此是伟大的。 另外提出的解决scheme有更多的副作用,为您的项目设置,因此是不太理想的:
- 使用编译器标志
--noStrictGenericChecks
closures更严格的通用检查。 然而,这会让你对自己的应用程序不那么严格,你可以这样做,但是可能会引入不一致的types定义,就像它在这个RxJS实例中所做的那样,反过来可能会在你的应用程序中引入更多的错误。 - 不检查标志为–skipLibCheck的库中的types设置为true。 这是不理想的,因为你可能不会得到一些types的错误报告。
- 升级到RxJS 6 Alpha – 考虑到有突变的变化,这可能会以不正确的方式打破你的应用程序,看到它仍然在阿尔法。 另外,如果你有像Angular 2+这样的其他依赖关系,这可能不是真正的支持选项,现在打破了框架本身。 我认为这是一个更难解决的问题。
一个被认可的创可贴方法是将以下内容添加到您的tsconfig.json文件中,直到RxJS人员在使用TypeScript 2.4.1时决定他们想要处理的错误为止:
"compilerOptions": { "skipLibCheck": true, }
您可以使用“ 模块扩充”临时解决该问题
以下代码为我解决了这个问题。 一旦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本身可以大量使用这种技术来描述自己的形状,这实际上也适用于一系列问题。
虽然有一定的局限性和粗糙的边缘,但是使这种技术更强大的一部分是我们可以使用它来增强现有的声明,使它们更安全,而不会分叉和维护整个文件。
只是一点点的细节,试图把我的两分钱。
当我们把Typescript升级到最新版本时,问题就出现了,最新的版本现在是TypeScript 2.4.1 [[因为我们喜欢升级:]“],正如@ Jonnysai在他的回答和链接中提到的那样 ,关于问题及其修复的详细讨论。
所以,对我有效的是:
1.我必须首先卸载TypeScript 2.4.1 ,通过控制面板 > 程序和function…
2.重新安装TypeScript 2.4.0 ,然后确保在package.json
文件中有这个
configuration,在这里提到一个相当短的细节。
对于Visual Studio 2015 ,您可以从这里下载TypeScript 2.4.0
您可以暂时使用--noStrictGenericChecks
标志在TypeScript 2.4中解决这个问题。
这是命令行中的 – --noStrictGenericChecks
,或者是在tsconfig.json
中的"compilerOptions"
字段中的"noStrictGenericChecks": true
。
请记住,RxJS 6将有此更正。
看到这个类似的问题: 如何解决TypeScript 2.4中的RxJS 5.x中的这个错误?
"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 install和ng发挥作用。
请更改Subject.d.ts
文件的以下行:
lift<R>(operator: Operator<T, R>): Observable<T>;
至:
lift<R>(operator: Operator<T, R>): Observable<R>;
返回types可能应该是Observable<R>
而不是Observable<T>
RxJS 6将有固定的,但作为临时解决方法,您可以使用noStrictGenericChecks
编译器选项。
在tsconfig.json
,把它放在compilerOptions
并将其设置为true。
{ "compilerOptions": { "noStrictGenericChecks": true } }
在命令行上--noStrictGenericChecks
。
为什么会这样:
TypeScript 2.4有一个严格的变化,而Subject不能提取正确的Observable。 签名确实应该是
(运营商:运营商)=>可观察
这将在RxJS 6中解决。
但是,单独使用上述内容并没有帮助,但是,使用以下方法: 在TypeScript 2.4和RxJs 5中,如何解决此“Subject错误地扩展Observable”错误
解决了这个问题。 这里还提到这个问题已经在RxJs 6中解决了,所以这更像是一个临时的解决scheme,它帮助我成功地运行了这个很好的例子(之前编译过,但在加载时发生错误): Angular 4应用程序开发使用Bootstrap 4和TypeScript
我发现同样的问题,我通过使用“rxjs”:“5.4.1” , “typescript”:“〜2.4.0”并将“noStrictGenericChecks”:true添加到tsconfig.json中来解决。
在tsconfig.config文件中保持noStrictGeneric选项为true
{ "compilerOptions": { "noStrictGenericChecks": true } }
是的,问题是TypeScript 2.4.1我只是从控制面板卸载,它适用于我,因为Visual Studio 2017已经这个。