我有一个库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);
});
答案 0 :(得分: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的完整声明,您应该考虑向typings registry提交PR,以便其他人也可以受益