'(snap:DataSnapshot)=>类型的参数void'不能分配给'(a:DataSnapshot)=>类型的参数。布尔”

时间:2016-10-04 06:42:38

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

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

我正在使用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,
                        });
                    });
                });
            }
}

2 个答案:

答案 0 :(得分:32)

forEach中的DataSnapshot方法具有此签名:

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;
        });
    });

答案 1 :(得分:0)

对于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!");
  });