2017-10-07 124 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)。

我希望它有帮助。