我如何解决 TypeScript 2.4 和 RxJS 5.x 中的这个 "Subject incorrectly extends Observable" 错误?
How do I get around this "Subject incorrectly extends Observable" error in TypeScript 2.4 and RxJS 5.x?
编译时,在 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 或更早版本的情况下解决这个问题?
解决方案
RxJS 5.4.2 现在应该可以与 TypeScript 2.4.1 完美配合。 如果可能,只需升级到 5.4.2+。
npm install --save rxjs@^5.4.2
然后尝试重新启动您的编辑器and/or如果您没有立即看到更改,请重新编译。
如果没有,下面的解决方案应该有效。
为什么会这样
TypeScript 2.4 发生了严格性变化,Subject<T>
没有提升到正确的 Observable
。签名真的应该是
<R>(operator: Operator<T, R>) => Observable<R>
这将在 RxJS 6 中修复。
备选方案
较新版本的 RxJS 将修复此问题,但作为临时解决方法,您可以使用 noStrictGenericChecks
编译器选项。
在tsconfig.json
中,放到"compilerOptions"
中,设置为true
。
{
"compilerOptions": {
"noStrictGenericChecks": true
}
}
在命令行上是 --noStrictGenericChecks
。
我在 package.json 文件中进行了以下两项更改。
1) 在依赖项部分将 rxjs 版本更改为 5.4.1。
"dependencies":
{
"rxjs": "5.4.1"
}
2) 在 devDependencies 部分将打字稿版本更改为 2.4.0。
"devDependencies": {
"typescript": "2.4.0"
}
I 运行 'npm install' 命令在进行了两个更改后有效。
今天遇到这个错误,通过以下三个步骤实际解决了这个问题。所以与希望分享相同的东西,它会帮助别人。
步骤 1: 在 package.json 文件中将条目更改为 "rxjs":“5.4.2”,
第 2 步:从项目中删除 node_modules 文件夹,该文件夹位于根目录
第 3 步: 现在,右键单击 package.json 文件并单击恢复,如下所示:
注意: 它将再次使用新文件创建 node_module 文件夹,现在构建解决方案,希望您不会遇到与上述问题相关的任何构建错误。
我在 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 版本的变化。
在你的主题中 class:
更改此行:
lift<R>(operator: Operator<T, R>): Observable<T>;
至:
lift<R>(operator: Operator<T, R>): Observable<R>;
添加
"noStrictGenericChecks": true
在 tsconfig.json 文件中
这是 rxjs 和 typescript 之间的不匹配问题,使用 "rxjs": "5.4.2" 和 "typescript": "~2.3.4" 对我有用
我 运行 遇到了同样的问题,发现以下网站很有帮助 https://www.georgephillipson.com/blog/jquery/setting-up-angular-2-in-visual-studio-2017/ 它有关于设置 MVC 网站的分步说明 Angular 解释了如何修复错误post 指的是 link 到 GitHub 的完整代码。
我发现它很有帮助,所以我想让其他人知道
根据 Zoes post,我添加了更多我认为 link 可能有用的原因
该页面展示了如何更新 RxJS 以修复错误,还展示了如何检查您的计算机上是否安装了 Node 和 NPM,并解释了如何添加 TypeScript,然后展示了如何设置您的 cshtml 文件显示 Angular 内容
在tsconfig.json中,放到"compilerOptions"中,设置为true。
{
"compilerOptions": true,
"compilerOptions": {
"noStrictGenericChecks": true
}
}
编译时,在 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 或更早版本的情况下解决这个问题?
解决方案
RxJS 5.4.2 现在应该可以与 TypeScript 2.4.1 完美配合。 如果可能,只需升级到 5.4.2+。
npm install --save rxjs@^5.4.2
然后尝试重新启动您的编辑器and/or如果您没有立即看到更改,请重新编译。
如果没有,下面的解决方案应该有效。
为什么会这样
TypeScript 2.4 发生了严格性变化,Subject<T>
没有提升到正确的 Observable
。签名真的应该是
<R>(operator: Operator<T, R>) => Observable<R>
这将在 RxJS 6 中修复。
备选方案
较新版本的 RxJS 将修复此问题,但作为临时解决方法,您可以使用 noStrictGenericChecks
编译器选项。
在tsconfig.json
中,放到"compilerOptions"
中,设置为true
。
{
"compilerOptions": {
"noStrictGenericChecks": true
}
}
在命令行上是 --noStrictGenericChecks
。
我在 package.json 文件中进行了以下两项更改。
1) 在依赖项部分将 rxjs 版本更改为 5.4.1。
"dependencies":
{
"rxjs": "5.4.1"
}
2) 在 devDependencies 部分将打字稿版本更改为 2.4.0。
"devDependencies": { "typescript": "2.4.0" }
I 运行 'npm install' 命令在进行了两个更改后有效。
今天遇到这个错误,通过以下三个步骤实际解决了这个问题。所以与希望分享相同的东西,它会帮助别人。
步骤 1: 在 package.json 文件中将条目更改为 "rxjs":“5.4.2”,
第 2 步:从项目中删除 node_modules 文件夹,该文件夹位于根目录
第 3 步: 现在,右键单击 package.json 文件并单击恢复,如下所示:
注意: 它将再次使用新文件创建 node_module 文件夹,现在构建解决方案,希望您不会遇到与上述问题相关的任何构建错误。
我在 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 版本的变化。
在你的主题中 class:
更改此行:
lift<R>(operator: Operator<T, R>): Observable<T>;
至:
lift<R>(operator: Operator<T, R>): Observable<R>;
添加
"noStrictGenericChecks": true
在 tsconfig.json 文件中
这是 rxjs 和 typescript 之间的不匹配问题,使用 "rxjs": "5.4.2" 和 "typescript": "~2.3.4" 对我有用
我 运行 遇到了同样的问题,发现以下网站很有帮助 https://www.georgephillipson.com/blog/jquery/setting-up-angular-2-in-visual-studio-2017/ 它有关于设置 MVC 网站的分步说明 Angular 解释了如何修复错误post 指的是 link 到 GitHub 的完整代码。
我发现它很有帮助,所以我想让其他人知道
根据 Zoes post,我添加了更多我认为 link 可能有用的原因
该页面展示了如何更新 RxJS 以修复错误,还展示了如何检查您的计算机上是否安装了 Node 和 NPM,并解释了如何添加 TypeScript,然后展示了如何设置您的 cshtml 文件显示 Angular 内容
在tsconfig.json中,放到"compilerOptions"中,设置为true。
{
"compilerOptions": true,
"compilerOptions": {
"noStrictGenericChecks": true
}
}