如何在 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 中,如何使用 (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 模块?