Вопрос: Свойство 'switchMap' не существует для типа 'Observable <User> - PullRequest
2 голосов
/ 17 марта 2019

У меня есть эта проблема при попытке запустить в git bash. .switchMap не выполняется и выдает ошибку как «ошибка TS2339: свойство« switchMap »не существует для типа« Наблюдаемый »»

Код, который я использую:

import { User } from './../classes/user';
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { Observable, of } from 'rxjs';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore, AngularFirestoreDocument } from '@angular/fire/firestore';
import { from } from 'rxjs';
@Injectable()
export class AuthService {

  public currentUser: Observable<User | null>;

  constructor(
    private router: Router,
    private alertService: AlertService,
    private afAuth: AngularFireAuth,
    private db: AngularFirestore
  ) {

    this.currentUser = this.afAuth.authState
      .switchMap((user) => {
        if (user) {
          return this.db.doc<User>(`users/${user.uid}`).valueChanges();
        } else {
          return of(null);
        }
      });
  }

моя версия rxjs - последняя версия rxjs@6.3.3, а версия nodejs - v8.12.0 Помогите, пожалуйста, создать сайт чата.

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Ваша проблема в том, что в RxJs 6 switchMap (наряду со многими другими операторами) больше не существует в Observable.Вместо этого вы должны передать наблюдаемое с помощью оператора .pipe(), который принимает любое количество методов и применяет их к наблюдаемому.Затем вы импортируете функцию switchMap, чтобы использовать ее в конвейере.

import { switchMap } from 'rxjs/operators';

....

this.currentUser = this.afAuth.authState.pipe(
  switchMap((user) => {
    if (user) {
      return this.db.doc<User>(`users/${user.uid}`).valueChanges();
    } else {
      return of(null);
    })
);

Если вы привыкли к старому (RxJs 5) поведению и хотите работать так, как есть пакетназывается rxjs-compat (установите его с npm install rxjs-compat), что позволяет использовать RxJs 6+ со старым синтаксисом.

Однако при использовании более нового синтаксиса наблюдается существенный выигрыш в производительности и размере пакета, поскольку он поддерживает TreeТрясет, поэтому я бы не советовал.

0 голосов
/ 17 мая 2019

Я знаю, что это очень поздний ответ, но я получил похожую ошибку.Для меня даже Ответ @Daniel не работал.Мне пришлось использовать трубу в отдельном утверждении:

...
this.currentUser = this.afAuth.authState;
this.currentUser.pipe(switchMap(user => {
    if (user) {
      // logged in, get custom user from Firestore
      return this.afs.doc<User>(`users/${user.uid}`).valueChanges()
    } else {
      // logged out, null
      return of(null)
    }
}))

Наряду с этим я столкнулся с некоторыми проблемами при импорте switchmap, of и Observable, но мне удалось получить все импортированное с помощью:

import { Observable } from 'rxjs';
import { of } from 'rxjs';
import {switchMap} from 'rxjs/operators';

Код отлично работал при

  • Угловой CLI: 7.3.8
  • Узел 10.15.3
  • Угловой 7.2.14
  • rxjs: 6.5.1
...