2016-08-17 38 views
0

我有一個庫jsforce的定義文件,它有自己的es6 promise實現。 jsforce.Promise本身只是es6-promise的擴展版本,並添加了一些額外的方法。我正試圖在我的jsforce.d.ts文件中複製這個文件,並且正在打一個路障。在打字稿定義文件中擴展和重命名導入

這裏是我的jsforce.d.ts相關部分:

/// <reference path="globals/es6-promise/index" /> 

declare module jsforce { 

    interface JsforcePromise<T> extends Promise<T> { 

     defer(): JsforcePromise.Deferred; 

     fail(onRejected: JsforcePromise.RejectedCallback<T>): JsforcePromise<T>; 

     thenCall(callback?: Callback<T>): JsforcePromise<T>; 

    } 

    export module JsforcePromise { 

     interface PromiseCallback<T> { 

     } 

     interface FulfilledCallback<T, T2> { 

     } 

     interface RejectedCallback<T> { 

     } 

     interface Deferred { 

     } 

    } 

    interface JSForce { 
     ... 
     Promise: JsforcePromise<any>; 
     ... 
    } 

} 

declare module "jsforce" { 
    var jsforce: jsforce.JSForce; 
    export = jsforce; 
} 

,並承諾建立:

let p = new jsforce.Promise<any>((res) => { 
    console.log(res); 
}, (err) => { 
    console.error(err); 
}); 

回答

1

我不會用全球es6-promise聲明,但使用該模塊的版本代替。這給你更多的控制權,並且不會污染你的全局命名空間。 typings install --save es6-promise應該做的伎倆。

此外,它似乎是你想要擴展Promise類的es6-promise,所以聲明一個接口不會做伎倆。另外Promise構造函數的代碼示例看起來有點不確定(jsforce似乎不可能覆蓋es6-promise的構造函數,但我沒有詳細介紹)。

所以你index.d.ts文件看起來是這樣的:

// index.d.ts 
declare namespace JsforcePromise { 
    interface Deferred { 
    someProperty: any 
    } 
} 

declare module "jsforce" { 
    import { Promise as Es6Promise } from 'es6-promise' 

    class Promise<T> extends Es6Promise<T> { 
    fancyPromiseMethod(): JsforcePromise.Deferred 
    } 
} 

然後你就可以在你的項目中的任何地方使用此代碼。

// app.ts 
import * as jsforce from 'jsforce' 

let p = new jsforce.Promise<any>((resolve, reject) => resolve()) 

p.fancyPromiseMethod().someProperty 

如果您有任何疑問,請告訴我!如果你正在寫一個jsforce API的完整聲明,你應該考慮提交一個PR到typings registry,這樣其他人也可以受益