2016-04-12 137 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