【问题标题】:Angular & RXJS - [ts] Property 'map' does not exist on type 'Observable<User>'Angular 和 RXJS - [ts] 属性 'map' 在类型'Observable<User>' 上不存在
【发布时间】:2018-07-09 11:27:43
【问题描述】:

自从创建了一个新的 Angular 6 项目后,我复制的一些以前的代码似乎无法正常工作。这似乎主要是 rxjs 语法

.map上,显示错误:

[ts] Property 'map' does not exist on type 'Observable'&lt;User&gt;'.

我似乎在 .take

的另一个文件上遇到了类似的错误

有人能指出我正确的方向来解决这个问题吗?

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivate, Router } from '@angular/router';

import { Observable } from 'rxjs';
import { AngularFireAuth } from 'angularfire2/auth';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/take';
import 'rxjs/add/operator/do';

@Injectable()

export class LoginGuardService implements CanActivate {

  constructor(
    private router: Router,
    private auth: AngularFireAuth
  ) { }


  canActivate(): Observable<boolean> {
    return this.auth.authState.map(authState => {
      if (authState) this.router.navigate(['/folders']);
      return !authState;
    }).take(1);
  }

}

第二后卫

canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot):

Observable<boolean> {

    this.authGuardStateURL = state.url;

    return this.auth.authState.pipe( 
      take(1)
      .map(authState => !!authState)
      .do(auth => !auth ? this.router.navigate(['/login']) : true)
    )

  }

【问题讨论】:

标签: rxjs angular6 angularfire5


【解决方案1】:

我认为您使用 Angular CLI 来创建您的应用程序。 Angular 6 附带 RxJS 6,从 v5 开始,RxJS 一直在使用可管道操作符。

所以你的代码应该是这样的:

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivate, Router } from '@angular/router';
import { Observable } from 'rxjs';
import { AngularFireAuth } from 'angularfire2/auth';
import { map, take, tap } from 'rxjs/operators';

@Injectable()

export class LoginGuardService implements CanActivate {

  constructor(
    private router: Router,
    private auth: AngularFireAuth
  ) { }

  canActivate(): Observable<boolean> {
    return this.auth.authState.pipe(
      map(authState => {
        if (authState) this.router.navigate(['/folders']);
        return !authState;
      }),
      take(1)
    )
  }

  //Second Guard

  canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot): Observable<boolean> {

      this.authGuardStateURL = state.url;

      return this.auth.authState.pipe(
        take(1),
        map(authState => !!authState),
        tap(auth => !auth ? this.router.navigate(['/login']) : true)
      )
   }
}

注意您现在如何导入运算符以及如何将 maptake 放入 pipe 方法中。

【讨论】:

  • 多么棒的准确答案。非常感谢。我的问题中有第二个警卫(对不起,我在您回复时添加了)...我正在添加管道,但是 .map 错误:属性 'map' 在类型 'MonoTypeOperatorFunction'。有任何想法吗?再次感谢。非常感谢。
  • 是的,我明白了,您收到此错误,因为您在 pipe 中使用了 .map()。点会有所不同。 Pipe 将 rxjs 运算符作为参数,因此您不必使用点。第一个参数/函数接受 observable,对其进行操作并将输出作为输入返回到pipe 中的下一个参数/函数。我用第二后卫的代码更新了我的答案。 do 已被 tap 方法替换。
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 2017-06-09
  • 2018-07-30
  • 1970-01-01
  • 2016-09-09
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多