ES6承诺/打字稿和蓝鸟承诺

时间:2017-03-09 07:57:23

标签: javascript typescript ecmascript-6 bluebird

我有一个nodejs / typescript 2项目并使用es6-promise包。 现在我想摆脱额外的包,因为我可以直接针对打字稿中的ES6。

所以我删除了es6-promise包并将tsconfig.json更改为目标es6。

{
  "compilerOptions": {
    "target": "es6",
    // ...
  }
}

许多第三方软件包使用Bluebird承诺,但承诺定义与github上不同帖子中所述的默认es6承诺不兼容

所以我收到以下错误。

  

TS2322:输入' Bluebird'不能分配类型'承诺'。财产' [Symbol.toStringTag]'

中缺少类型

npm @types/bluebird-global上还有其他类型的包。 在其中一篇博客文章中,用户建议使用它代替@types/bluebird,但是一些第三方软件包(例如,sequelize typings)引用bluebird而不是bluebird-global,所以我得到了蓝鸟缺失类型的另一个错误。

让这个工作起来的好方法是什么?

2 个答案:

答案 0 :(得分:1)

由于Bluebird中没有[Symbol.toStringTag],因此它确实不兼容。还有其他一些不同的蓝鸟实现与本机Promise不同 - 调度程序,错误处理......正确的处理方法是:

const promise: Promise<type> = Promise.resolve<type>(bluebirdPromise);

如果运行时兼容性不是一个问题,那么只能通过相对类型安全的方式使用类型转换来解决这个问题:

const promise: Promise<type> = <Promise<type>><any><Bluebird<type>>bluebirdPromise;

const promise: Promise<type> = <Promise<type>><PromiseLike<type>>bluebirdPromise;

答案 1 :(得分:1)

我正在处理

  

TS2322:输入&#39; Bluebird&#39;不能分配类型&#39;承诺&#39;。财产&#39; [Symbol.toStringTag]&#39;

中缺少类型

找到了这个帖子: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/10801

TL; DR;它的版本是执行以下操作之一:

  1. 在每个.ts条目文件中添加以下内容以覆盖全局承诺:

    import * as Bluebird from 'bluebird';

    declare global { export interface Promise<T> extends Bluebird<T> {} }

  2. 或者

    1. 将所有承诺包装在Bluebird承诺构造函数中。这里有一些运行时开销,它在Bluebird的站点上被列为反模式。
    2. 顺便说一句,我无法获得第二种选择,但第一种选择对我来说很好。