web-dev-qa-db-ja.com

ES6プロミス/ TypeScriptとBluebirdプロミス

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を参照しているため、欠落しているために別のエラーが発生しますブルーバードのタイピング。

これを機能させるための良い解決策は何ですか?

15
dknaack

私が扱っていた

TS2322:タイプ「Bluebird」はタイプ「Promise」に割り当てることができません。プロパティ '[Symbol.toStringTag]'がタイプ 'Bluebird'にありません。

そしてこのスレッドを見つけました: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/10801

TL; DR;そのバージョンは、次のいずれかを実行することです。

  1. 各.tsエントリファイルに次を追加して、グローバルpromiseを上書きします。

    import * as Bluebird from 'bluebird';

    declare global { export interface Promise<T> extends Bluebird<T> {} }

または

  1. すべてのプロミスをBluebirdプロミスコンストラクタでラップします。ここには実行時のオーバーヘッドがあり、Bluebirdのサイトにアンチパターンとしてリストされています。

余談ですが、2番目のオプションを機能させることはできませんでしたが、最初のオプションはうまく機能しました。

3
Justin Kruse

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;
2
Estus Flask