扩展和重命名打字稿定义文件中的导入

时间:2016-08-17 20:02:55

标签: typescript typescript-typings

我有一个库jsforce的定义文件,它有自己的es6 promises实现。 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 个答案:

答案 0 :(得分:1)

我不会使用全局es6-promise声明,而是使用模块版本。这为您提供了更多控制,并且不会污染您的全局命名空间。 typings install --save es6-promise应该做到这一点。

此外,您似乎想要扩展Promisees6-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的完整声明,您应该考虑向typings registry提交PR,以便其他人也可以受益