2016-04-12 16 views
4

プロンプトを使用するNode.jsライブラリと、ES6 Promiseを使用したTypeScript宣言を使用していますが、ライブラリ自体を任意の約束ライブラリを使用するようにカスタマイズすることもできます。タイプスクリプトのオーバーライドES6 Promise for Bluebird

したがって、Bluebirdをそのライブラリに渡して問題なく使用できます。

問題は、私のライブラリがES6 Promiseを介してのみインターフェイスを宣言しているため、宣言レベルでBluebird約束インタフェースを表示する方法です。

ライブラリ自体を変更することなく、別のPromiseプロトコルを使用していることをコンパイラに認識させる方法はありますか?

もちろん、後者はキャッチです。ライブラリを変更できるかどうかは疑いありません。

そしてそれは、そのライブラリがどのようなものであるかを理解するのは、それから、このシンプルなインタフェースを取るようにする任意の助けである場合:

interface Protocol { 
    methodName(param1:string, param2:number):Promise<Object[]> 
} 

をして、その大きさの1000倍を掛けます。

私は自分のファイルでプロトコルを偽装することはできません。 PromiseがデフォルトのES6ではなく、Bluebird TypeScriptが提供するものであることをコンパイラに伝える方法を理解する必要があります。

+0

ライブラリ定義を上書きする独自の定義ファイルを含めることができます。それはあなたが意味することですか? –

+0

@MikeMcCaughanライブラリ全体を自分のファイルでオーバーライドすることはできません。ライブラリのインターフェイスは膨大です。 –

+0

さて、あなたはしたくないかもしれません;)。私が考えることができる唯一の他の方法は、 'Promise = bluebird.Promise'(または[構文が何であれ)(https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Namespaces%)です。 20and%20Modules.md))をライブラリのすべての定義ファイルの先頭に追加します。 –

答えて

0

あなたはおそらくこれは、非好ましい方法上記@Paarthのコメントから撮影

import Bluebird from 'bluebird'; 

type Promise = Promise | Bluebird; 

ある組合https://www.typescriptlang.org/docs/handbook/advanced-types.html#union-types

を使用して約束のタイプを上書きすることができ、あなたはあなたを型キャストできBluebirdはES6 Promiseを約束します。

import Bluebird from 'bluebird'; 

class Http implements Protocol { 
    methodName(url: string, payload: number): Promise<Object[]> { 
    return <Promise<Object[]>>new Bluebird((resolve, reject) => { 

     // Do whatever you need to do ... use the url & payload 

     resolve([{ data: 'Done' }]); 
    }); 
    } 
} 


let http = new Http(); 

http.methodName('//get-some-data', 10); 

免責事項:あなたがそうのようにそれを消費することができ

interface Protocol { 
    methodName(param1:string, param2:number):Promise<Object[]> 
} 

これは、サードパーティのライブラリなどを考えると好ましい方法

である私はそうではありませんこれをテストするためにコンパイルしました - 私は現時点で環境が設定されておらず、jsbinはTypescript cを混乱させていますompiler

関連する問題