【问题标题】:ES6 Promise / Typescript and the Bluebird PromiseES6 Promise / Typescript 和 Bluebird Promise
【发布时间】:2017-03-09 07:57:23
【问题描述】:

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

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

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

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

所以我收到以下错误。

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

npm @types/bluebird-global 上有一个其他类型的包。 在其中一篇博文中,用户建议使用它而不是 @types/bluebird,但一些 3rd 方包(例如,续集类型)引用了 bluebird 而不是 bluebird-global,所以我得到另一个关于 bluebird 缺少类型的错误。

什么是让它工作的好解决方案?

【问题讨论】:

  • 您可以尝试将:interface Bluebird { [Symbol.toStringTag]: string } 放入文件bluebird-patch.d.ts 中吗?
  • 谢谢,但这对我不起作用。
  • 最终这些包返回给你 Bluebird 的承诺,所以你应该在你的项目中包含 Bluebird 包和定义文件。尝试像原生 Promise 一样“重命名”bluebird 承诺“Promise”可能真的很令人困惑(即使他们有相同的 API)另外我也看不到这样做。 :)

标签: javascript typescript ecmascript-6 bluebird


【解决方案1】:

我正在处理

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 的网站上被列为反模式。

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

【讨论】:

    【解决方案2】:

    由于 Bluebird 中没有 [Symbol.toStringTag],它确实不兼容。 Bluebird 实现与原生 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 2015-10-23
      相关资源
      最近更新 更多