I have a nodejs / typescript 2 project and use the es6-promise package.
Now i would like to get rid of the extra package because i can target ES6 in typescript directly.
So i removed the es6-promise package and changed the tsconfig.json to target es6.
{
"compilerOptions": {
"target": "es6",
// ...
}
}
Many 3rd party packages uses the Bluebird promise but the promise definition is incompatible to the default es6 promise as stated on different posts on github
- bluebird 3.0 definifion is not assignable to ES6 Promises
- Provide a way to load Bluebird globally in es6 compilation target.
- Add Symbol.toStringTag to promise instance
So i am getting the following error.
TS2322: Type 'Bluebird' is not assignable to type 'Promise'. Property '[Symbol.toStringTag]' is missing in type 'Bluebird'.
There is a other types package on npm @types/bluebird-global.
In one of the blog post a user suggests to use it instead of @types/bluebird but some 3rd party packages (e.g. sequelize typings) reference bluebird and not bluebird-global so i get another error for the missing typings of bluebird.
What is a good solution to get this to work?
Since there is no [Symbol.toStringTag]
in Bluebird, it's incompatible indeed. There are other things that differ Bluebird implementation from native Promise - scheduler, error handling... The correct way to handle this is:
const promise: Promise<type> = Promise.resolve<type>(bluebirdPromise);
If runtime compatibility is not an issue for sure, this can be addressed with type casting only in relatively type-safe manner:
const promise: Promise<type> = <Promise<type>><any><Bluebird<type>>bluebirdPromise;
or
const promise: Promise<type> = <Promise<type>><PromiseLike<type>>bluebirdPromise;
I was dealing with
TS2322: Type 'Bluebird' is not assignable to type 'Promise'. Property '[Symbol.toStringTag]' is missing in type 'Bluebird'.
and found this thread:
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/10801
The TL;DR; version of it is to do one of the following:
In each of your .ts entry files add the following to overwrite the global promise:
import * as Bluebird from 'bluebird';
declare global { export interface Promise<T> extends Bluebird<T> {} }
Or
- wrap all promises in a Bluebird promise constructor. There is some runtime overhead here and it is listed as an anti pattern on Bluebird's site.
As an aside, I could not get the second option to work, but the first worked fine for me.