Свойство 'do' не существует в типе 'Observable <IProduct[]> '

После обновления до Angular 6.0 и Rxjs до 6.0 я получаю следующую ошибку компиляции:

Property 'do' does not exist on type 'Observable'.

Вот код:

import { Observable, of } from 'rxjs';
import 'rxjs/add/operator/do';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import { IProduct } from './product';

@Injectable()
export class ProductService { 
    constructor(
        private product: IProduct)
    {         
    }

    getProduct = () => { 
        return product.products
            // error on next line
            .do(data => console.log('All:' + JSON.stringify(data)))
            .catch(this.handleError);
    }

    private handleError(err: HttpErrorResponse) { 
        console.log(err.message);
        return Observable.throw(err.message);        
    }
}

Любая идея?

Ответ 1

Проблема не в угловых, а с rxjs. rxjs ввела нарушение изменений с версии rxjs 6.

Чтобы ваш код снова работал без изменения какого-либо кода, установите следующий пакет:

npm install [email protected] --save

Затем вы сможете скомпилировать свой проект. rxjs-compat предназначен для временного решения, поэтому вам нужно обновить свою кодовую базу для работы с новой версией.


Новый путь импорта

Что вам нужно обновить:

  1. Обновление импортных заявлений от

    import { Observable } from "rxjs/Observable";

    в

    import { Observable } from "rxjs";

  2. Обновите импорт вашего оператора из

    import 'rxjs/add/operator/do'

    в

    import { do } from "rxjs/operators";


Переименованные операторы

Некоторые операторы также были переименованы из-за конфликтов имен с зарезервированными словами JavaScript. Они есть

  1. do => tap

  2. catch => catchError

  3. switch => switchAll

  4. finally => finalize


Отсутствие цепочки операторов

Вы также не можете больше привязывать своих операторов к использованию оператора pipe например

// an operator chain
source
  .map(x => x + x)
  .mergeMap(n => of(n + 1, n + 2)
    .filter(x => x % 1 == 0)
    .scan((acc, x) => acc + x, 0)
  )
  .catch(err => of('error found'))
  .subscribe(printResult);
// must be updated to a pipe flow
source.pipe(
  map(x => x + x),
  mergeMap(n => of(n + 1, n + 2).pipe(
    filter(x => x % 1 == 0),
    scan((acc, x) => acc + x, 0),
  )),
  catchError(err => of('error found')),
).subscribe(printResult);