将 rxjs 升级到 6 后,属性 'map' 在类型 'Observable' 上不存在
Property 'map' does not exist on type 'Observable' after upgrading rxjs to 6
我按照 https://update.angular.io 的说明将我的 Angular 应用程序从版本 5.2 升级到 6.0。
现在我的 Angular 应用程序由于 "rxjs-5-to-6-migrate" 迁移而无法构建:
ERROR in bla.ts: error TS2339:
Property 'map' does not exist on type 'Observable'.
我有以下导入:
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); }));
一切都在RxJS v5.x to v6 Update Guide
中解释
仅从 'rxjs/operators'
和 "creation" 运算符导入运算符 'rxjs'
:
import { map } from 'rxjs/operators';
import { of } from 'rxjs';
从 rxjs/Rx
导入只因为您添加了 rxjs-compat
包。升级到 RxJS 6 后你不应该使用它。
您需要在 Observable 上使用 pipe
方法并在内部传递 map 函数,例如:
import { of } from 'rxjs';
import { map } from 'rxjs/operators';
of([1,2,3]).pipe(
map(i => i*2)
);
您的导入现在应该如下所示:
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)
)
我按照 https://update.angular.io 的说明将我的 Angular 应用程序从版本 5.2 升级到 6.0。
现在我的 Angular 应用程序由于 "rxjs-5-to-6-migrate" 迁移而无法构建:
ERROR in bla.ts: error TS2339: Property 'map' does not exist on type 'Observable'.
我有以下导入:
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); }));
一切都在RxJS v5.x to v6 Update Guide
中解释仅从 'rxjs/operators'
和 "creation" 运算符导入运算符 'rxjs'
:
import { map } from 'rxjs/operators';
import { of } from 'rxjs';
从 rxjs/Rx
导入只因为您添加了 rxjs-compat
包。升级到 RxJS 6 后你不应该使用它。
您需要在 Observable 上使用 pipe
方法并在内部传递 map 函数,例如:
import { of } from 'rxjs';
import { map } from 'rxjs/operators';
of([1,2,3]).pipe(
map(i => i*2)
);
您的导入现在应该如下所示:
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)
)