Nodejs/TypeScript 2プロジェクトがあり、 es6-promise パッケージを使用しています。 TypeScriptでES6を直接ターゲットにできるので、追加のパッケージを削除したいと思います。
そこで、es6-promiseパッケージを削除し、tsconfig.jsonをターゲットのes6に変更しました。
{
"compilerOptions": {
"target": "es6",
// ...
}
}
多くのサードパーティパッケージはBluebirdプロミスを使用していますが、Githubのさまざまな投稿に記載されているように、プロミスの定義はデフォルトのes6プロミスと互換性がありません
したがって、次のエラーが発生します。
TS2322:タイプ「Bluebird」はタイプ「Promise」に割り当てることができません。プロパティ '[Symbol.toStringTag]'がタイプ 'Bluebird'にありません。
Npm @ types/bluebird-global には他のタイプパッケージがあります。ブログ投稿の1つで、ユーザーが @ types/bluebird の代わりにそれを使用することを提案していますが、一部のサードパーティパッケージ(たとえば、逐次型付け)はbluebird-globalではなくbluebirdを参照しているため、欠落しているために別のエラーが発生しますブルーバードのタイピング。
これを機能させるための良い解決策は何ですか?
私が扱っていた
TS2322:タイプ「Bluebird」はタイプ「Promise」に割り当てることができません。プロパティ '[Symbol.toStringTag]'がタイプ 'Bluebird'にありません。
そしてこのスレッドを見つけました: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/10801
TL; DR;そのバージョンは、次のいずれかを実行することです。
各.tsエントリファイルに次を追加して、グローバルpromiseを上書きします。
import * as Bluebird from 'bluebird';
declare global { export interface Promise<T> extends Bluebird<T> {} }
または
余談ですが、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;