Свойство '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); }));

person Shamshiel    schedule 18.05.2018    source источник
comment
вы пробовали import 'rxjs/add/operator/map';?   -  person CruelEngine    schedule 18.05.2018
comment
попробуйте с import { map } from 'rxjs/operators';   -  person Michael Doye    schedule 18.05.2018


Ответы (3)


Вам нужно использовать метод pipe в Observable и передать функцию карты внутри, например:

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

of([1,2,3]).pipe(
  map(i => i*2)
);
person Vitalii Bobrov    schedule 18.05.2018
comment
В этом ответе делается дополнительное важное замечание о том, что OP должен будет сделать для продвижения вперед помимо простого исправления импорта. - person msanford; 18.05.2018
comment
Фактически, это будет работать только до тех пор, пока вы не установите rxjs-compat. В RxJS 6 и 'rxjs/observable', и 'rxjs/observable/of' больше не существуют. - person martin; 18.05.2018
comment
конечно, фиксированный импорт - person Vitalii Bobrov; 18.05.2018
comment
Спасибо! Ваш ответ помог мне найти настоящую проблему. Я обновил свой вопрос для других, чтобы отразить мою настоящую проблему. - person Shamshiel; 18.05.2018

Здесь все объясняется в Руководство по обновлению RxJS v5.x до v6

Операторы импорта только из 'rxjs/operators' и операторов «создания» 'rxjs':

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

Импорт из rxjs/Rx работает только потому, что вы добавили rxjs-compat пакет. Вы не должны использовать его после обновления до RxJS 6.

person martin    schedule 18.05.2018

Теперь ваш импорт должен выглядеть так:

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)
)
person Nadhir Falta    schedule 18.05.2018