如何在Typescript 2.1+中使用Bluebird

时间:2016-12-28 09:59:47

标签: javascript typescript promise bluebird typescript2.1

(我已阅读this post,但它是从八月开始,它没有回答我当前打字稿版本的问题。)

我目前在我的项目中使用Typescript 1.8,这很好用:

import * as Promise from "bluebird";
async function f() : Promise<void> {
  return Promise.delay(200);
}

但如果我尝试使用Typescript 2.1进行编译:

index.ts(2,16): error TS1059: Return expression in async function does not have a valid callable 'then' member.

在Typscript中搜索使用Bluebird Promises的问题,我也发现了许多github讨论,评论和PR,但它们都很难掌握,在讨论有趣的观点时,我无法找到说明如何我现在应该让它上班。

那么,我怎么能在Typescript 2.1中使用Bluebird for Promises?

3 个答案:

答案 0 :(得分:5)

请考虑使用@types/bluebird-global,如下所示。

npm install --save-dev @types/bluebird-global

在主入口点导入一次。

// The same Promise API, everywhere.
import * as Promise from 'bluebird'
global.Promise = Promise

有关更多背景信息,请参阅DefinitelyTyped issue #11027

答案 1 :(得分:2)

我在这里问了同样的问题:https://github.com/Microsoft/TypeScript/issues/8331

最后,我自己的答案有效。以下是如何在没有额外.d.ts文件的情况下在TypeScript 2.3中使用它:

import * as Bluebird from 'bluebird';

export interface DummyConstructor extends Bluebird<any> {
    new<T>(): Bluebird<T>;
}

declare global {
    interface Promise<T> extends Bluebird<T> {
        then(...args: any[]): any;
        catch(...args: any[]): any;
    }

    interface PromiseConstructor extends DummyConstructor {}

    var Promise: Promise<any>;
}

Promise = Bluebird as any;

async function test() {
    console.log('PING');
    await Promise.delay(1000);
    console.log('PONG');
}

test();

在定位原生ES7时,它很可怕并且在将来不会工作,因为将来async / await根本不会返回Bluebird的承诺而且没有任何回报可以做到这一点。但是,在此之前和转换到ES5时,这将继续有效。

尽管存在多种any类型,但它似乎有点类型安全。我确信它可以改进。

答案 2 :(得分:-5)

总体概述,请看一下 SO documentation page 例如。对于蓝鸟,你可以只打字安装蓝鸟。这段代码对我很好:

&#13;
&#13;
import Promise = require('bluebird')
Promise.resolve("foo").then(function (msg) {
  console.log(msg)
})
&#13;
&#13;
&#13;