我已经阅读过有关此问题的几个问题和答案,但无法解决。
我正在使用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,
});
});
});
}
}
答案 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!");
});