2017-10-07 219 views
3

我開始了一個新項目,我想使用TypeScript而不是純Javascript。我正在努力將Bluebird與第三方庫結合使用。藍鳥和es6承諾打字稿

請看下面的例子:

import * as Promise from 'bluebird' 

    private requestPlayerProfile(playerTag:string):Promise<IPlayerProfile> { 
    const requestOptions = Object.create(this.options)  
    return this.limiter.schedule(request, requestOptions) 
    } 

問題:limiter是一個第三方庫的一個實例,limiter.schedule顯然返回原生的承諾,而我使用的是藍鳥承諾在休息我的應用程序。我將如何妥善處理這種情況?

[TS]類型 '承諾' 是不能分配給輸入 '藍鳥'。屬性類型'then'與 不兼容。

+1

它取決於您正在使用的庫返回的Promise類型。如果它返回一個香草Promise,您可以手動映射到另一個,或者簡單地使用原生Promise而不是藍鳥。 –

+0

什麼是香草諾言?我認爲它會返回一個原生的ES6承諾,並且當我使用原生承諾時,我實際上需要在任何地方使用原生承諾或?所以調用requestPlayerProfile函數的所有路由/函數都需要與Bluebird一起工作。如果我真的需要一直混合本地和藍鳥諾言,是不是真的說服我使用藍鳥? – kentor

回答

3

@Filipe正在解釋錯誤信息。

  • 無論是通過this.limiter.schedule(...)返回對象的類型,該類型是具有bluebird.Promise<IPlayerProfile>不相容。
  • 沒有人能夠可靠地假定limiter.schedule(...)返回「vanila」,即本地的,Promise<IPlayerProfile>對象。您可以通過轉到定義schedule(...)的源代碼輕鬆地找出它。在我的Visual Studio代碼中,我使用F12到達那裏。注意那裏對象的精確返回類型。
  • 取決於到底是返回什麼,你有兩個主要選擇:
    1. 使用承諾在您的代碼,而不是依靠bluebird的承諾完全無處不類型;或
    2. Convert that promise type to a bluebird one。我還沒有嘗試過自己,但以下內容應該可以工作:return Promise.resolve(this.limiter.schedule(request, requestOptions))(請參閱http://bluebirdjs.com/docs/api/promise.resolve.html)。

我希望它有幫助。