【问题标题】:Type 'Observable<unknown>' is not assignable to type 'Observable<Something>'类型 'Observable<unknown>' 不可分配给类型 'Observable<Something>'
【发布时间】:2019-11-17 20:24:44
【问题描述】:

我是 Angular 和 Firebase 的新手。当我尝试从rxjs 导入of 以及尝试使用switchMap 返回null 时出现此错误。 auth.service.ts

import { ActivatedRoute } from '@angular/router'
import { Observable,  of } from 'rxjs';
import { Injectable } from '@angular/core';
import { AppUser } from './models/app-user'
import { AngularFireAuth } from '@angular/fire/auth';
import { switchMap } from 'rxjs/operators';
import * as firebase from 'firebase';
import { UserService } from './user.service';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  user$: Observable<firebase.User>;

  constructor(
    private userService: UserService,
    private afAuth: AngularFireAuth,  
    private route: ActivatedRoute) { 
    this.user$=afAuth.authState;
  }

  login(){
    let returnUrl=this.route.snapshot.queryParamMap.get('returnUrl')||'/'
    localStorage.setItem('returnUrl',returnUrl)
    this.afAuth.auth.signInWithRedirect(new firebase.auth.GoogleAuthProvider())
  }
  logout(){
    this.afAuth.auth.signOut()
  }

  get appUser$():Observable<AppUser>{
    return this.user$
    .pipe(switchMap(user=> {
      if(user) return this.userService.get(user.uid).valueChanges();
    return Observable.of(null);    <==line of error
    })
}
}

user.service.ts

import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireObject } from '@angular/fire/database';
import * as firebase from 'firebase';
import { AppUser } from './models/app-user';

@Injectable({
  providedIn: 'root'
})
export class UserService {

  constructor(private db:AngularFireDatabase) { }

  save(user: firebase.User){
    this.db.object('/users/'+user.uid).update({
      name: user.displayName,
      email: user.email
    })
  }

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

app.user.ts

export interface AppUser{
    name: string,
    email:string,
    isAdmin: boolean
} 

Type 'Observable&lt;unknown&gt;' is not assignable to type 'Observable&lt;AppUser&gt;' 视为错误。

【问题讨论】:

  • 你能试试return empty()而不是return Observable.of()吗?
  • 它适用于return of(null)

标签: angular firebase rxjs


【解决方案1】:

尝试使用typescript optional parameters

而不是name: string;

更改为name?: string;

export class AppUser {
  name?: string;
  email?: string;
  isAdmin?: boolean;
  photoURL?: string;
}

希望这行得通。

【讨论】:

    【解决方案2】:

    看起来您可能在您的tsconfig.json 中启用了strictNullChecks,因此它不会让您将null 分配给输入AppUser,这是正确的。

    因此您可以将返回类型定义为Observable&lt;AppUser | null&gt;,其中还包括null 值。

    也许还可以尝试将 RxJS 升级到适合您的最新版本。我认为 ofs 打字 https://github.com/ReactiveX/rxjs/issues/4723 曾经有问题,但也许这与您的问题无关。

    【讨论】:

      【解决方案3】:

      感谢您的回复。它通过将isAdmin?: string 添加到app-user.ts 以及import { of } from 'rxjs' ... return of(null) 来工作 工作。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,我所做的只是添加import { of } from 'rxjs'

        【讨论】:

          猜你喜欢
          • 2020-07-28
          • 2021-10-28
          • 2020-01-10
          • 2020-04-17
          • 2020-01-10
          • 1970-01-01
          • 1970-01-01
          • 2020-07-29
          • 2018-08-14
          相关资源
          最近更新 更多