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

spl*_*unk 11 firebase ionic-framework firebase-realtime-database ionic2

我已经阅读了关于这个问题的几个问题和答案但是无法解决它.

我正在使用Ionic2,我有一个方法可以从Firebase Database 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'.
Run Code Online (Sandbox Code Playgroud)

这是方法:

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,
                        });
                    });
                });
            }
}
Run Code Online (Sandbox Code Playgroud)

car*_*ant 33

有这个签名的forEach方法DataSnapshot:

forEach(action: (a: firebase.database.DataSnapshot) => boolean): boolean;
Run Code Online (Sandbox Code Playgroud)

因为action可以返回true短路枚举并提前返回.如果返回有价值的值,枚举将继续正常进行.(这在文档中提到.)

要安抚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;
        });
    });
Run Code Online (Sandbox Code Playgroud)