【问题标题】:Argument of type '(snap: DataSnapshot) => void' is not assignable to parameter of type '(a: DataSnapshot) => boolean''(snap: DataSnapshot) => void' 类型的参数不可分配给 '(a: DataSnapshot) => boolean' 类型的参数
【发布时间】:2017-02-12 05:36:14
【问题描述】:

我已经阅读了有关此问题的几个问题和答案,但无法解决。

我正在使用 Ionic2,并且我有一个从 Firebase 数据库 v3 检索数据的方法。 我不明白为什么我在执行ionic serve 时会在控制台中出现以下错误:

Error TS2345: Argument of type '(snap: DataSnapshot) => void' is not assignable to parameter of type '(a: DataSnapshot) => boolean'.
  Type 'void' is not assignable to type 'boolean'.

这是方法:

constructor(private http: Http) {

    firebase.database().ref('users').orderByChild("id").on("value", function(snapshot){
                    let items = [];
                    snapshot.forEach(snap => {
                        items.push({
                            uid: snap.val().uid,
                            username: snap.val().username,
                        });
                    });
                });
            }
}

【问题讨论】:

    标签: ionic-framework firebase firebase-realtime-database ionic2


    【解决方案1】:

    DataSnapshot 中的forEach 方法具有以下签名:

    forEach(action: (a: firebase.database.DataSnapshot) => boolean): boolean;
    

    因为action 可以返回true 以使枚举短路并提前返回。如果返回虚假值,则枚举正常继续。 (这在documentation中有提到。)

    为了安抚 TypeScript 编译器,最简单的解决方案是返回 false(以继续枚举子快照):

    database()
        .ref("users")
        .orderByChild("id")
        .on("value", (snapshot) => {
            let items = [];
            snapshot.forEach((snap) => {
                items.push({
                    uid: snap.val().uid,
                    username: snap.val().username
                });
                return false;
            });
        });
    

    【讨论】:

      【解决方案2】:

      对于 Typescript 版本,我提出了这个解决方案:

      db
        .ref(`jobs`)
        .orderByChild("counter")
        .on("value", (querySnapshot) => {
          const jobs: any[] = [];
          querySnapshot.forEach((jobRef) => {
            jobs.push(jobRef.val());
          });
          jobs.forEach(async (job) => {
            await minuteRT(job);
          });
          res.status(200).send("done!");
        });
      

      【讨论】:

        猜你喜欢
        • 2021-10-18
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 2018-08-27
        • 2021-08-24
        相关资源
        最近更新 更多