如何在 Typescript 2.1+ 中使用 Bluebird

Posted

技术标签:

【中文标题】如何在 Typescript 2.1+ 中使用 Bluebird【英文标题】:How to use Bluebird in Typescript 2.1+ 【发布时间】:2017-05-12 14:11:31 【问题描述】:

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

我目前在我的项目中使用 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 讨论、cmets 和 PR,但它们都很难掌握,在讨论有趣的点时,我找不到任何地方说明我的方式'我现在应该让它工作。

那么,我应该如何在 Typescript 2.1 中将 Bluebird 用于 Promises?

【问题讨论】:

【参考方案1】:

考虑使用@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 了解更多上下文。

【讨论】:

【参考方案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 类型,但它似乎有点类型安全。我相信它可以改进。

【讨论】:

以上是关于如何在 Typescript 2.1+ 中使用 Bluebird的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 的类中使用元组

在 TypeScript 中,如何使用 (a: type, b:type): any 实现接口?

白鹭直播间:聊聊Egret引擎4.0 与 TypeScript 2.1~

如何获取特定版本的 Jquery(例如 3.2.1)的 TypeScript 定义文件?

ThinkJS 2.1:支持 TypeScript,性能提升 90%

如何在 Visual Studio 2019 中使用具有功能的 .net core + typescript + webpack + npm 模块?