代码之家  ›  专栏  ›  技术社区  ›  Shamshiel

将rxjs升级到6后,类型“Observable”上不存在属性“map”

  •  2
  • Shamshiel  · 技术社区  · 6 年前

    我使用来自的说明将Angular应用程序从5.2版升级到了6.0版 https://update.angular.io .

    现在,由于“rxjs-5-to-6-migrate”迁移,我的Angular应用程序无法构建:

    bla中的错误。ts:错误TS2339: 类型“Observable”上不存在属性“map”。

    我有以下几种进口产品:

    import { Observable } from 'rxjs/observable';
    import { of } from 'rxjs/observable/of';
    import { map } from 'rxjs/operators';
    

    如果我像这样更改导入,它会工作:

    import { Observable } from 'rxjs/observable';
    import 'rxjs/Rx';
    

    但我不明白为什么。。。我希望使用显式导入,而不是导入所有运算符。


    更新: 正如一些答案所指出的,我必须使用管道才能使用操作员。这是我的问题,因为我认为我仍然可以将操作符链接到可观察对象。

    旧式:

    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/observable/of';
    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/catch';
    
    this.http.get('/api/appsettings/get').map(data => { return true; }).catch(() => { return Observable.of(false); });
    

    新风格

    import { of,  Observable } from 'rxjs';
    import { catchError, map } from 'rxjs/operators';
    
    this.http.get('/api/appsettings/get').pipe(map(data => { return true; }), catchError(() => { return of(false); }));
    
    3 回复  |  直到 6 年前
        1
  •  5
  •   Vitalii Bobrov    6 年前

    你需要使用 pipe 方法中的可观察和传递映射函数,如:

    import { of } from 'rxjs';
    import { map } from 'rxjs/operators';
    
    of([1,2,3]).pipe(
      map(i => i*2)
    );
    
        2
  •  5
  •   msanford    6 年前

    一切都在这里解释了 RxJS v5.x to v6 Update Guide

    仅从中导入运算符 'rxjs/operators' 和“创建”操作符 'rxjs' :

    import { map } from 'rxjs/operators';
    import { of } from 'rxjs';
    

    从进口 rxjs/Rx 只因为你添加了 rxjs-compat 包裹升级到RxJS 6后不应该使用它。

        3
  •  1
  •   Nadhir Falta    6 年前

    您的导入现在应该是这样的:

    import { Observable, of } from 'rxjs';
    import { map } from 'rxjs/operators';
    

    你不能用 Observable.of 你必须使用 of()

    你需要把任何操作符包装在 .pipe 就像这样:

    .pipe(
         finalize(() => { this.isBusy = false; }),
         take(1),
         map(DATA => DATA.MESSAGEID)
    )