Angular 6 和 RxJS 6 重大变化

Posted

技术标签:

【中文标题】Angular 6 和 RxJS 6 重大变化【英文标题】:Angular 6 & RxJS 6 Breaking Changes 【发布时间】:2019-02-08 00:22:49 【问题描述】:

我已经用谷歌搜索了这个废话,但找不到解决方案。

我使用这样的代码已经有一段时间了。 http 是有角度的 HttpClient。

 forgotPassword(email: string): Observable<ApiReturn> 
        const url = `$this.apiURL/ForgotPassword`;
        const params = 
            email
        ;
        return this.http
            .post<ApiReturn>(url, params, this.requestOptions)
            .pipe(catchError(e => this.handleError(e)));
    

我更新到最新的 Angular 6.x 版本和 RxJS 6(从 5.5 开始)。现在代码在抱怨 catchError:

“OperatorFunction”类型的参数不能分配给“OperatorFunction”类型的参数。 参数 'source' 和 'source' 的类型不兼容。 类型“Observable”不可分配给类型“Observable”。

我的 HttpInterceptor 现在也无法编译。

import  Injectable  from '@angular/core';
import 
    HttpEvent,
    HttpInterceptor,
    HttpHandler,
    HttpRequest,
    HttpResponse
 from '@angular/common/http';
import  Log, Level  from 'ng2-logger/client';
import  Observable  from 'rxjs';
import  map, tap  from 'rxjs/operators';

@Injectable()
export class AuthInterceptor implements HttpInterceptor 
    constructor() 
    

    intercept(
        req: HttpRequest<any>,
        next: HttpHandler
    ): Observable<HttpEvent<any>> 
        // Get the auth header from the service.
        // const authHeader = this.global.authenticationToken;
        // Clone the request to add the new header.
        const authReq = req.clone(
            headers: req.headers
                .set('Access-Control-Allow-Origin', window.location.href)
        );
        // Pass on the cloned request instead of the original request.
        return next.handle(authReq);
    

错误:[ts] 类型 'import("c:/ProjDotNet/collegebowl-site/node_modules/@angular/core/node_modules/rxjs/internal/Observable").Observable>' 不可分配给类型 'import("c:/ProjDotNet/collegebowl-site/node_modules/rxjs/internal/Observable").Observable>'。 财产类型' 源'不兼容。

基本上是同一个问题。

我收集到我在管道函数中缺少一些基本的东西,但我无法弄清楚或找到一个正在做我正在做的事情的例子。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

仔细查看错误消息。它说

import("c:/ProjDotNet/collegebowl-site/node_modules/@angular/core/node_modules/rxjs/internal/Observable").Observable>

import("c:/ProjDotNet/collegebowl-site/node_modules/rxjs/internal/Observable").Observable>

是不同的类型。也就是说,您实际上有两种不同类型的 Observable,它们来自位于文件系统不同目录中的不同 RxJS 副本。

也就是说,你的 node_modules 处于一个非常奇怪的状态。运行 npm ls rxjsyarn why rxjs 可能会提供线索,说明为什么 npm / yarn 认为安装两次 RxJS 是个好主意。

【讨论】:

Meriton - 感谢您的帮助。当我看到这个时,我做了我应该做的事情。 ol' 是否吹走了 node_modules 和 package-lock.json 并重新安装。修复了所有问题。 这是由于复制和粘贴来自不同项目的代码.. 至少对我来说是【参考方案2】:

就像@meriton 所说,这是因为您在多个 node_modules 中有多个 rxjs 实例。 我发现的最佳解决方案是在 tsconfig.json 中添加一个别名,以强制在任何地方使用相同的 rxjs:

"compilerOptions": 
  "paths": 
      "rxjs": [
        "node_modules/rxjs"
      ],
      "rxjs/*": [
        "node_modules/rxjs/*"
      ]
   

【讨论】:

谢谢它真的很好用!只需添加您必须为paths 定义baseUrl 选项才能工作。

以上是关于Angular 6 和 RxJS 6 重大变化的主要内容,如果未能解决你的问题,请参考以下文章

Angular 6 / Rxjs - 如何基础:observables 成功,错误,最后

更新到 Angular 6 和 rxjs 6 后 Plunker 坏了

无法在 RxJs 6 和 Angular 6 中使用 Observable.of

Angular 6 RXJS 导入语法?

Angular:如何使用 RXJS 6 调用 finally()

Angular 7、Ngrx、Rxjs 6 - 访问延迟加载模块之间的状态