我有一个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,所以我得到了蓝鸟缺失类型的另一个错误。
让这个工作起来的好方法是什么?
答案 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;它的版本是执行以下操作之一:
在每个.ts条目文件中添加以下内容以覆盖全局承诺:
import * as Bluebird from 'bluebird';
declare global { export interface Promise<T> extends Bluebird<T> {} }
或者
顺便说一句,我无法获得第二种选择,但第一种选择对我来说很好。