TypeScript和Firebase云功能:对象的类型为“未知”

时间:2019-12-11 12:12:47

标签: typescript firebase google-cloud-functions

我正在尝试使用TypeScript制作Firebase云功能。我有以下使用诺言的代码:

        const pro_books = new Promise((resolve,reject)=>{
            resolve(db.child("Books").orderByChild("avg_rating").limitToFirst(15));       
        })
        pro_books
        .catch((error) => {
            console.log("Recommendations:   Error loading books");

        })
        .then((list_book) => {
            book_id_arr = (list_book).map((x:string)=>{
                const book:Book = JSON.parse(x);
                return book.id;
            })
        }).catch(() => 'obligatory catch');

问题在于映射功能,特别是对于list_book(在try块内的第一行),并且我得到的错误(在构建过程中)是“对象的类型为'未知'”。 list_book应该是我运行的查询的结果,所以它可能是某种类型的JSON文档数组,我尝试强制使用一种类型,但我不知道确切的操作方法以及使用的类型。

编辑:book_id_arr先前定义为let book_id_arr:String[] = new Array();

1 个答案:

答案 0 :(得分:0)

db.child("Books").orderByChild("avg_rating").limitToFirst(15)不是Query结果。它只是查询的声明。

如果要获得结果,则需要调用get()方法或set a listener

在您的情况下,您应该使用get()方法,该方法会返回一个将用QuerySnapshot进行解析的Promise,因此您无需将其包装在新的Promise中。

如果要在结果map()上使用QuerySnapshot,则需要调用其docs属性,该属性返回“ QuerySnapshot中所有文档的数组”。

以下应该可以解决问题:

    const pro_books_query = db.child("Books").orderByChild("avg_rating").limitToFirst(15);       
    return pro_books_query.get()
    .then((list_book) => {
        book_id_arr = list_book.docs.map(...);
        return ...
    })
    .catch(err => 
        console.log("Recommendations: Error loading books - " + err);
        return null;
    );