获取可分配给类型参数的错误

时间:2018-10-02 11:24:26

标签: angular typescript rxjs

我在下面的代码块中使用“ rxjs”:“〜6.2.0”

lit.click

userService的get方法具有以下逻辑。

    canActivate():Observable<boolean>
     {
      return this.auth.user$.pipe
      (
        switchMap( 
                 user => 
                   {
                   return this.userService.get(user.uid);
                   }
                 )
       ).pipe( map( appUser => appUser.isAdmin))
     }

我遇到错误

  

“类型'(user:User)=> AngularFireObject'的参数不是   可分配给类型'(值:用户,索引:数字)=>的参数   ObservableInput”。类型“ AngularFireObject”不是   可分配给类型“ ObservableInput”。       类型“ AngularFireObject”不可分配给类型“ Iterable”。         类型“ AngularFireObject”中缺少属性“ [Symbol.iterator]”。”

2 个答案:

答案 0 :(得分:2)

您无需在此处使用两个管道,map的结果appUser.isAdmin使用同一管道。

canActivate():Observable<boolean>
{
      return this.auth.user$
       .pipe(
           switchMap(user => this.userService.get(user.uid)), 
           map(appUser => appUser.isAdmin)
       )
}

此外,您还应该修改userService.get()以返回从Observable获得的正确的valueChanges()

get(uid : string): Observable<any>
{
     return this.db.object('/users/'+ uid).valueChanges();
}

答案 1 :(得分:0)

传递给SwitchMap的参数应该是Observable,但是this.userService.get(user.uid)返回AngularFireObject<AppUser>

AngularFireObject来自AngularFire。我没有使用AngularFire,但是从我得到的结果来看,您必须在valueChanges()上调用AngularFireObject才能获得Observer。因此,如果您可以更改UserService,它应该如下所示:

get(uid : string): Observable<AppUser>
{
    return this.db.object('/users/'+ uid).valueChanges();
}

正如Amit Chigadani所述,您应该将switchMap和map放在同一管道中,并简化switchMap中的箭头功能。