2017-04-15 76 views
1

我有一個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); 
    }); 
} 

然而,這會導致下面的錯誤消息(注意在消息中的差異是基於其中在表達即時懸停):

enter image description here

如果任何人的興趣在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:正如在評論中指出了......這些錯誤似乎只發生使用流行的藍鳥承諾庫

+2

使用內置的標準承諾,我沒有得到任何錯誤的代碼。也就是說,你對自己的要求越來越高。在這種情況下,'()=> Promise.resolve(true)'相當於'()=> true',因此不需要在promise中包含返回值(或錯誤)。對於你的存在函數'return getRecord(path).then(snap => Boolean(snap.val()))''也是一樣的,不需要把Promise.reject當作回調來捕獲,因爲這基本上是noOP。 – Gerrit0

+0

我想到我需要Promise.resolve/reject,以便允許該功能的用戶繼續承諾鏈。這可能不是真的,它的意義在於檢查我的WRT承諾一段時間的假設,但即使僅返回布爾值也不會影響錯誤。 – ken

+0

僅供參考...我使用流行的藍鳥承諾庫而不是內置的承諾(可能從上面的圖片清楚)。 – ken

回答

1

目前還沒有直觀的方式讓Bluebird承諾覆蓋TypeScript提供的全球Promise。這個問題在這裏討論:

因此,在短期,我的問題是更多的使用藍鳥承諾在一些箱子但在其他本土承諾的影響。要強制使用藍鳥的工作解決方案是:

/src/[xxxx].js

import * as Bluebird from './bluebird'; 

/src/bluebird.js

declare module 'bluebird-global' { 
    import * as Bluebird from 'bluebird'; 
    global { export interface Promise<T> extends Bluebird<T> {} } 
} 

這樣你應該總是得到藍鳥承諾,我遇到的錯誤將被避免。


更新...甚至更好的解決方案。包括@types/bluebird-global模塊,你就完成了!

注意:如果您的tsconfig.js文件,你正在使用的「類型」參數(最不),然後加入藍鳥全局以下部分:

types: [ 
    "bluebird-global" 
] 
+0

嗨@ken。你能更新你的'更新'嗎? :) 1.它是'@ types/bluebird-global',而不是'@ types/global-bluebird'(你幾乎給我一個心臟病發作,因爲我認爲有人對這個空間進一步進行分割)。 2.開發人員不需要定義'compilerOptions.types',除非他們已經使用'compilerOptions.types'(這很少見,所以假設開發人員完全不需要這樣做,請參閱https:// github.com/DefinitelyTyped/DefinitelyTyped/blob/b036cb2/types/bluebird-global/index.d.ts#L14)。如果你想知道:說明已經改變了昨天:) –

+0

正在更新:) – ken

0

很難說什麼時候。太多回調地獄。嘗試使用現代javascript:

export async function remove(path: string): Promise<boolean> { 
    try { 
     const e: boolean = await exists(path); 
     if (e) { 
      await getRef(path).remove(); 
      return true; 
     } else { 
      return false; 
     } 
    } catch (err) { 
     console.log(`There was an error trying to remove the path "${path}": `, err); 
     throw err; 
    } 
} 

我沒有看到任何理由爲什麼它不應該工作。但萬一 - 發表評論。

+0

我喜歡異步/等待,但我們還沒有在這個項目上使用它。但是,您的答案似乎並未解決與TypeScript錯誤相關的問題。 – ken