【问题标题】:Type 'Observable<AngularFireAction<DatabaseSnapshot<unknown>>>' is not assignable to type 'Observable<Course>'类型“Observable<AngularFireAction<DatabaseSnapshot<unknown>>>”不可分配给类型“Observable<Course>”
【发布时间】:2020-01-10 14:11:02
【问题描述】:

我有一个 Angular 8 应用程序并使用 firebase。我想从服务中检索数据。所以我做了一个检索数据的函数。但是我在该功能上遇到错误

我搜索了很多并阅读了 firebase 文档。但它并没有解决问题。

这就是我拥有的功能:

 findCourseByUrl(courseUrl: string): Observable<Course> {

    return this.db.list('courses', ref => {
      return ref.orderByChild('url').equalTo(courseUrl);
    }).snapshotChanges().pipe(map(data => data[0]));

  }

但我仍然收到此错误:

Type 'Observable<AngularFireAction<DatabaseSnapshot<unknown>>>' is not assignable to type 'Observable<Course>'.
  Type 'AngularFireAction<DatabaseSnapshot<unknown>>' is missing the following properties from type 'Course': id, url

如果我这样做:

  findCourseByUrl(courseUrl: string): Observable<Course> {

    return this.db.list('courses', ref => {
      return ref.orderByChild('url').equalTo(courseUrl);
    }).snapshotChanges().pipe(
        map(actions => {
          return actions.map(a => {
            const data = a.payload.doc.data() as Course;
            return { ...data };
          });
        }));

  }

然后我会得到这个错误:

Property 'doc' does not exist on type 'DatabaseSnapshot<unknown>'.
  Property 'doc' does not exist on type 'DatabaseSnapshotExists<unknown>'.ts(2339)
Type 'Observable<{ id: string; url: string; description: string; iconUrl: string; courseListIcon: string; longDescription: string; }[]>' is not assignable to type 'Observable<Course>'.
  Type '{ id: string; url: string; description: string; iconUrl: string; courseListIcon: string; longDescription: string; }[]' is missing the following properties from type 'Course': id, url, description, iconUrl, and 2 more.ts(2322)

这是模型:


export interface Course {
    id: string;
    url: string;
    description: string;
    iconUrl: string;
    courseListIcon: string;
    longDescription: string;
}

【问题讨论】:

    标签: angular firebase firebase-realtime-database rxjs


    【解决方案1】:

    尝试像这样更改您的代码:

    findCourseByUrl(courseUrl: string): Observable<Course> {
    
        return this.db.object('courses', ref => {
          return ref.equalTo(courseUrl);
        }).snapshotChanges().pipe(
            map(actions => {
              return actions.map(a => {
                const data = a.payload.val() as Course;
                const id = a.payload.key;
                return { id, ...data };
              });
            }));
      }
    

    编辑

    上面的代码是单个对象和对象列表的混合,所以它不起作用。以下代码用于获取单个对象。

    findCourseByUrl(courseUrl: string): Observable<Course> {
    
        return this.db.object(`courses/${courseUrl}`).snapshotChanges().pipe(
            map(a => {
              const data = a.payload.val() as Course;
              const id = a.payload.key;
              return { id, ...data };
            });
      }
    

    【讨论】:

    • @mightycodeNewton 我编辑了我的答案试试这个。如果不起作用,请提供您的Course 型号。
    • Type 'Observable' 不可分配给类型 'Observable'。键入'{ id:字符串;网址:字符串;描述:字符串;图标网址:字符串; courseListIcon:字符串;长描述:字符串; }[]' 缺少“Course”类型的以下属性:id、url、description、iconUrl 和 2 more.ts(2322)
    • 我编辑了我的答案,但不确定它是否是从实时数据库中获取单个节点的正确方法。
    • 谢谢。但仍然出现此错误:预期 1 个参数,但得到 2.ts(2554)。类型“未知”.ts(2339) 上不存在属性“地图”
    猜你喜欢
    • 2020-07-28
    • 2021-10-28
    • 1970-01-01
    • 2020-04-17
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多