2016-04-12 186 views
4

我有一個Node.js庫使用承諾,其TypeScript聲明使用ES6 Promise,即使庫本身可以定製使用任何承諾庫。TypeScript覆蓋ES6承諾與藍鳥

所以,我沒有問題在Bluebird傳入該庫,以便它可以使用它。

問題是如何使藍鳥承諾界面在聲明級別可見,因爲我的庫只通過ES6 Promise聲明其接口。

有沒有辦法讓編譯器意識到我正在使用不同的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% 20和%20Modules.md))位於所有庫定義文件的頂部。 –

回答

0

你可以使用一個聯盟https://www.typescriptlang.org/docs/handbook/advanced-types.html#union-types

這是不首選方法

import Bluebird from 'bluebird'; 

type Promise = Promise | Bluebird; 

從上面@Paarth的評論以,你可以強制轉換可能會覆蓋無極型的藍鳥承諾ES6承諾。

這是由於第三方庫作爲首選方式

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

你可以使用它,像這樣:

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); 

免責聲明:我沒有編譯這個來測試它 - 我目前沒有設置環境,jsbin正在使用Typescript c ompiler