0

我尝试从 firebase 检索嵌套数据并保持其类型安全。我看过这个: https ://github.com/aaronksaunders/afwithngcli/blob/master/src/app/afwithngcli.component.ts 但它不使用接口。

我的界面(针对此示例进行了简化):

export interface IStudy {
  $key?: string;
  description: string;
  subjects: ISubject[];
}

export interface ISubject {
  $key?: string;
  description: string;
  someOtherData: string;
  classes: IClass[];
}

export interface IClass {
  $key?: string;
  description: string;
  someOtherData: string;
}

我的服务:

@Injectable()
export class MyService {
  private myStudies$: FirebaseListObservable<IStudy[]>;

  constructor(af: AngularFire, auth: AuthService) {
    this.myStudies$ = af.database.list(`/studies/${auth.id}`).map((studies: IStudy[]) => {
      return studies.map(study => {
        study.subjects = af.database.list(`/subjects/${study.$key}`).map((subjects: Subject[]) => {
          return subjects.map(subject => {
            subject.classes = af.database.list(`/classes/${subject.$key}`);
            return subject;
          })
        });
        return study;
      })
    })
  }

  getMyStudies(): Observable<IStudy[]> {
    return this.myStudies$;
  }
}

我尝试做的是将我所有的研究(包括所有科目和课程)作为可观察的,以便我可以在一个组件中显示和编辑所有级别。

我收到错误消息:

Type 'Observable<IStudy[]>' is not assignable to type 'FirebaseListObservable<IStudy[]>'.
Property '_ref' is missing in type 'Observable<IStudy[]>'.

Type 'Observable<ISubject[]>' is not assignable to type 'ISubject[]'.
Property 'length' is missing in type 'Observable<ISubject[]>'.

Type 'FirebaseListObservable<any[]>' is not assignable to type 'IClass[]'.
Property 'length' is missing in type 'FirebaseListObservable<any[]>'.

问题出在构造函数中,错误突出显示分配给 this.myStudies$、study.subjects 和 subject.classes 的错误。

我究竟做错了什么?

4

1 回答 1

0

FirebaseListObservable 是与 Observable 不同的类型。尝试改变:

 getMyStudies(): Observable<IStudy[]> {
    return this.myStudies$;
  }

getMyStudies(): FirebaseListObservable <IStudy[]> {
    return this.myStudies$;
}

编辑:我认为您应该避免对可观察对象进行如此深的嵌套调用,但乍一看,这里有一个错误:

您分配FirebaseListObservablesubject.classes.

于 2016-09-07T07:22:29.587 回答