Свойство 'map' не существует в типе 'Observable' после обновления rxjs до 6
Я обновил свое приложение Angular с версии 5.2 до 6.0 с инструкциями из https://update.angular.io/.
Теперь мое приложение Angular не собирается из-за миграции "rxjs-5-to-6-migrate":
ОШИБКА в bla.ts: ошибка TS2339: Свойство 'map' не существует для типа '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); }));
3 ответа
Вам нужно использовать pipe
метод на Observable и передать карту функции внутри, например:
import { of } from 'rxjs';
import { map } from 'rxjs/operators';
of([1,2,3]).pipe(
map(i => i*2)
);
Все объясняется здесь, в Руководстве по обновлению с RxJS v5.x до v6
Операторы импорта только из 'rxjs/operators'
и операторы "создания" 'rxjs'
:
import { map } from 'rxjs/operators';
import { of } from 'rxjs';
Импорт из rxjs/Rx
работает только потому, что вы добавили rxjs-compat
пакет. Вы не должны использовать его после обновления до RxJS 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)
)