键入'Observable <true | Promise <boolean >>'不能分配给'boolean | UrlTree | Observable <布尔值| UrlTree> | Promise <布尔值| UrlTree>'

时间:2019-08-11 08:39:30

标签: angular typescript rxjs

我有canActivate方法的警卫:

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
      return this.fireAuth.authState.pipe(
        take(1),
        map(authState => !!authState),
        map(auth => !auth ? this.router.navigate(['/']) : true)
      )
  }

这是可行的,但是我在控制台中遇到打字错误:

  

auth.guard.ts(20,7)中的错误:错误TS2322:无法将类型'Observable>'分配给类型'boolean | UrlTree |可观察答应。”

我该如何解决?

1 个答案:

答案 0 :(得分:0)

请勿使用map()。您不想更改发射的值。您只想产生副作用。

take(1),
map(authState => !!authState),
tap(auth => {
  if (!auth) {
    this.router.navigate(['/']);
  }
});

或者,如果它使您更容易理解:

take(1),
map(authState => {
  if (authState) {
    return true;
  } else {
    this.router.navigate(['/']);
    return false;
  }
});

或者更好,当路由器必须导航到其他地方时,返回UrlTree而不是导航自己:

take(1),
map(authState => !!authState || this.router.parseUrl('/'))