我有一個TypeScript功能,可以刪除Firebase數據庫中的「路徑」。它返回一個Promise,然後解析爲一個布爾標誌,指示內容是否真的在那裏(也就是說,如果它不存在則不需要刪除)。使用打字稿推斷類型的問題
功能看起來像這樣:
export function remove(path: string): Promise<boolean> {
return exists(path)
.then(existance => {
return existance
? getRef(path).remove()
.then(() => Promise.resolve(true))
: Promise.resolve(false);
})
.catch((err: any) => {
console.log(`There was an error trying to remove the path "${path}": `, err);
return Promise.reject(err);
});
}
然而,這會導致下面的錯誤消息(注意在消息中的差異是基於其中在表達即時懸停):
如果任何人的興趣在exists()
功能 - 這,順便說一句,有打字稿沒有問題 - 那就是:
export function exists(path: string): Promise<boolean> {
return getRecord(path)
.then(snap => snap.val()
? Promise.resolve(true)
: Promise.resolve(false)
)
.catch(Promise.reject);
}
無論如何,我不知道爲什麼我會得到這些錯誤,並且會喜歡任何人都可能擁有的洞察力。
p.s.我使用的打字稿2.2.2
UPDATE:正如在評論中指出了......這些錯誤似乎只發生使用流行的藍鳥承諾庫
使用內置的標準承諾,我沒有得到任何錯誤的代碼。也就是說,你對自己的要求越來越高。在這種情況下,'()=> Promise.resolve(true)'相當於'()=> true',因此不需要在promise中包含返回值(或錯誤)。對於你的存在函數'return getRecord(path).then(snap => Boolean(snap.val()))''也是一樣的,不需要把Promise.reject當作回調來捕獲,因爲這基本上是noOP。 – Gerrit0
我想到我需要Promise.resolve/reject,以便允許該功能的用戶繼續承諾鏈。這可能不是真的,它的意義在於檢查我的WRT承諾一段時間的假設,但即使僅返回布爾值也不會影響錯誤。 – ken
僅供參考...我使用流行的藍鳥承諾庫而不是內置的承諾(可能從上面的圖片清楚)。 – ken