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

dkn*_*ack 13 javascript typescript ecmascript-6 bluebird

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

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

{
  "compilerOptions": {
    "target": "es6",
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

所以我收到以下错误.

TS2322:类型'Bluebird'不能分配给'Promise'类型."Bluebird"类型中缺少属性'[Symbol.toStringTag]'.

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

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

Jus*_*use 5

我正在处理

TS2322:“Bluebird”类型不可分配给“Promise”类型。“Bluebird”类型中缺少属性“[Symbol.toStringTag]”。

并找到了这个线程: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> {} }

或者

  1. 将所有承诺包装在 Bluebird 承诺构造函数中。这里有一些运行时开销,它在 Bluebird 的站点上被列为反模式。

顺便说一句,我无法让第二个选项起作用,但第一个对我来说效果很好。


Est*_*ask 4

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

const promise: Promise<type> = Promise.resolve<type>(bluebirdPromise);
Run Code Online (Sandbox Code Playgroud)

如果运行时兼容性肯定不是问题,则只能以相对类型安全的方式通过类型转换来解决这个问题:

const promise: Promise<type> = <Promise<type>><any><Bluebird<type>>bluebirdPromise;
Run Code Online (Sandbox Code Playgroud)

或者

const promise: Promise<type> = <Promise<type>><PromiseLike<type>>bluebirdPromise;
Run Code Online (Sandbox Code Playgroud)