web-dev-qa-db-ja.com

TypeScript 2.1以降でBluebirdを使用する方法

(私は この投稿 を読みましたが、8月からのものであり、現在のTypeScriptバージョンに関する私の質問には答えていません。)

私のプロジェクトでは現在TypeScript 1.8を使用していますが、これは正常に機能します。

import * as Promise from "bluebird";
async function f() : Promise<void> {
  return Promise.delay(200);
}

しかし、TypeScript 2.1でコンパイルしようとすると、次のようになります。

index.ts(2,16): error TS1059: Return expression in async function does not have a valid callable 'then' member.

TypscriptでBluebird Promisesを使用する際の問題をググると、githubでのディスカッション、コメント、PRもたくさん見つかりましたが、それらはすべて把握するのが非常に難しく、興味深い点についてディスカッションしていると、私が想定している方法を説明する場所が見つかりませんこれを今すぐ機能させる。

では、TypeScript 2.1でBluebird for Promisesを使用するにはどうすればよいですか?

12
Ludwik

次のように@types/bluebird-globalの使用を検討してください。

npm install --save-dev @types/bluebird-global

これをメインのエントリポイントに1回インポートします。

// The same Promise API, everywhere.
import * as Promise from 'bluebird'
global.Promise = Promise

詳細については DefinitelyTyped issue#11027 を参照してください。

6
Mikol Graves

ここで同じ質問をしました: https://github.com/Microsoft/TypeScript/issues/8331

結局、私自身の答えがうまくいきました。 TypeScript 2.3で追加の.d.tsファイルなしで使用する方法は次のとおりです。

import * as Bluebird from 'bluebird';

export interface DummyConstructor extends Bluebird<any> {
    new<T>(): Bluebird<T>;
}

declare global {
    interface Promise<T> extends Bluebird<T> {
        then(...args: any[]): any;
        catch(...args: any[]): any;
    }

    interface PromiseConstructor extends DummyConstructor {}

    var Promise: Promise<any>;
}

Promise = Bluebird as any;

async function test() {
    console.log('PING');
    await Promise.delay(1000);
    console.log('PONG');
}

test();

これは恐ろしいことであり、ネイティブES7を対象とする場合、将来的に機能しなくなります。将来的には、async/awaitはBluebirdのプロミスを返さず、何もできないからです。ただし、それまで、ES5へのトランスパイルを行うと、これは機能し続けます。

複数のany型にもかかわらず、いくぶん型安全であるように見えます。きっと改善できると思います。

2
jjrv