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,所以我得到了蓝鸟缺失的另类错误.
什么是让这个工作的好方法?
我正在处理
TS2322:“Bluebird”类型不可分配给“Promise”类型。“Bluebird”类型中缺少属性“[Symbol.toStringTag]”。
并找到了这个线程:https : //github.com/DefinitelyTyped/DefinitelyTyped/issues/10801
TL; DR; 它的版本是执行以下操作之一:
在每个 .ts 条目文件中添加以下内容以覆盖全局承诺:
import * as Bluebird from 'bluebird';
declare global { export interface Promise<T> extends Bluebird<T> {} }
或者
顺便说一句,我无法让第二个选项起作用,但第一个对我来说效果很好。
由于 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)
归档时间: |
|
查看次数: |
5020 次 |
最近记录: |