Angular rxjs/Subject.d.ts错误:Class';主题<;T>';错误地扩展基类';可观察<;T>';
我从中提取了示例模板代码,并执行了以下两个步骤来开始-Angular rxjs/Subject.d.ts错误:Class';主题<;T>';错误地扩展基类';可观察<;T>';,angular,typescript,rxjs,Angular,Typescript,Rxjs,我从中提取了示例模板代码,并执行了以下两个步骤来开始- npm安装//运行良好,创建了具有所有依赖项的node\u modules文件夹 npm启动 //失败,出现以下错误- node_modules/rxjs/Subject.d.ts(16,22): error TS2415: Class 'Subject<T>' incorrectly extends base class 'Observable<T>'. Types of property 'lift'
npm安装//运行良好,创建了具有所有依赖项的node\u modules文件夹
npm启动
//失败,出现以下错误-
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
根据需要,您需要更新typescript 2.3.4或rxjs 6 alpha
在项目更新typescript或rxjs版本中,转到your package.json文件。
范例
是否安装npm
更新(2017年6月29日):-
根据PytScript <代码>“2.4.0”<代码>工作> < /P> < P>一个公认的带帮助的方法是将下列内容添加到您的TSCOntas.JSON文件中,直到RXJS用户在使用TyrScript 2.4.1:
时决定他们想做什么错误。
"compilerOptions": {
"skipLibCheck": true,
}
您可以临时使用--noStrictGenericChecks
标志在TypeScript 2.4中绕过此问题
这是命令行上的--noStrictGenericChecks
,或者是tsconfig.json
中编译器选项“
字段中的noStrictGenericChecks:true
请记住,RxJS 6将对此进行更正
请参阅类似问题:您可以使用
下面的代码为我解决了这个问题。一旦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>;
}
}
//augmentations.ts
从'rxjs/Operator'导入{Operator};
从“rxjs/Observable”导入{Observable};
//TODO:当RxJS的稳定版本没有bug可用时,删除此选项。
声明模块“rxjs/Subject”{
接口主题{
升降机(操作员:操作员):可观察;
}
}
虽然RxJS本身如此大量地使用这种技术来描述其自身的形状可能具有讽刺意味,但它实际上通常适用于一系列问题
虽然确实存在限制和粗糙边缘,这项技术之所以强大,部分原因是我们可以使用它来增强现有的声明,使它们更加类型安全,而无需分叉并维护整个文件。正如其他人所指出的,这个问题是TypeScript 2.4中引入的更严格的泛型类型检查的结果。这暴露了RxJS类型定义中的不一致性,因此在中得到了修复所以理想的解决方案是升级到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>;
}
}
//TODO:当RxJS发布了一个稳定的版本并正确声明了“Subject”时,删除此选项。
从'rxjs/Operator'导入{Operator};
从“rxjs/Observable”导入{Observable};
声明模块“rxjs/Subject”{
接口主题{
升降机(操作员:操作员):可观察;
}
}
他的解决方案不会留下任何其他副作用,因此是伟大的。或者,建议的解决方案对项目设置有更多的副作用,因此不太理想:
- 使用编译器标志
--noStrictGenericChecks
关闭更严格的通用检查。不过,这将降低对您自己的应用程序的严格要求,您可以这样做,但可能会引入不一致的类型定义,就像在这个RxJS实例中一样,这反过来可能会在您的应用程序中引入更多错误
- 不检查flag--skipLibCheck设置为true的库中的类型。这也不理想,因为您可能不会报告某些类型错误
- 升级到RxJS 6 Alpha-鉴于存在突破性的更改,这可能会以糟糕的方式破坏您的应用程序,因为它仍然处于Alpha状态。此外,如果您有其他依赖项,如Angular 2+,那么这可能不是一个真正受支持的选项,现在或以后会破坏框架本身。我认为这是一个更难解决的问题
只是一点细节,试图把我的两分钱放进去。
当我们将Typescript升级到最新版本时,问题就出现了,到目前为止,这个版本是[“因为我们喜欢升级:)”],在他的回答和提供的链接中,有一个关于问题及其修复的详细讨论。
因此,对我有效的是:
1.我必须先安装TypeScript 2.4.1,方法是进入控制面板>程序和功能…
2.重新安装,然后确保在package.json
文件中,您具有此
配置,如较短的细节所述。
您可以从Visual Studio 2015下载TypeScript 2.4.0,但仅使用上述方法并没有帮助,但使用以下方法:
解决了问题。这里还提到,这个问题在RxJs 6中已经修复,因此这更像是一个临时修复,它帮助我成功地运行了这个伟大的示例(之前编译过,但在加载期间出现了错误):
在package.json中“rxjs”:“^5.4.2”、
和“typescript”:“^2.3.4”、然后npm安装和ng serve其工作原理。是的,问题在于
打字稿2.4.1
我刚刚从“控制面板”中卸载了它,它对我很有效,因为Visual Studio 2017已经有了它。RxJS 6将对此进行修复,但作为临时解决方法,您可以使用noStrictGenericChecks
编译器选项
在tsconfig.json
中,将其放入compilerOptions
并将其设置为true
{
"compilerOptions": {
"noStrictGenericChecks": true
}
}
在命令行上,它是--noStrictGenericChecks
发生原因:
TypeScript 2.4的严格程度发生了变化,主体没有提升到正确的可观察状态。签名真的应该是
(操作员:操作员)=>可观察
这将在RxJS 6中修复。请更改Subject.d.t的以下行
"compilerOptions": {
"skipLibCheck": true,
}
// 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>;
}
}
// 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>;
}
}
"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"
}
{
"compilerOptions": {
"noStrictGenericChecks": true
}
}
lift<R>(operator: Operator<T, R>): Observable<T>;
lift<R>(operator: Operator<T, R>): Observable<R>;
{
"compilerOptions": {
"noStrictGenericChecks": true
}
}
npm uninstall ionic-native --save
"noStrictGenericChecks": true
"rxjs": "5.4.1",
"typescript": "~2.4.0"
"rxjs": "5.4.1",
"typescript": "~2.4.0"