我正在使用通过 @types
安装的类型 def我想修改。Q
有一个很软的.d.ts
这不允许您指定传递给 reject
的参数的类型在 Deferred
. Defferred
的接口(interface)看起来像这样:
declare namespace Q {
// ...
export interface Deferred<T> {
promise: Promise<T>;
resolve(value?: IWhenable<T>): void;
reject(reason: any): void;
notify(value: any): void;
makeNodeResolver(): (reason: any, value: T) => void;
}
// ...
}
使用普通接口(interface),您可以只创建具有匹配名称的接口(interface),例如
global.d.ts
并且它们会自动合并,我无法让它与命名空间中的接口(interface)一起使用。我想做的是在我的
global.d.ts
中放入这样的东西文件:declare namespace Q {
export interface Deferred<T, R, N> {
reject(reason: R): void;
notify(value: N): void;
}
export function defer<T, R, N>(): Deferred<T, R, N>;
}
并将该接口(interface)和功能合并回
Q
中的那些。 .d.ts
在 @types
.通过调用 const def = Q.defer<string, string, number()
来测试这个加薪 Supplied parameters do not match any signature of call target.
.
最佳答案
你可以这样做:
declare namespace Q {
export interface Deferred<T, E=any, N=any> {
promise: Promise<T>;
resolve(value?: IWhenable<T>): void;
reject(reason: E): void;
notify(value: N): void;
makeNodeResolver(): (reason: any, value: T) => void;
}
}
您不能重命名通用参数
T
, 如果你添加任何额外的参数,它们需要有默认值,以便 Deferred
的其他用途不需要额外的东西。更新 1
@桑迪吉福德said :
For brevity I left out the modification to bits of
Q
that usedDeferred
. I've edited my question to include them. This still didn't seem to work - callingQ.defer<string, string, number>()
still raises an exception.
您仍然必须为添加到
defer
的任何额外泛型类型提供默认参数。功能。我不知道你的项目到底是如何布局的,但这样的东西对我有用,模块增强:import { Q } from 'q'
declare module 'q' {
namespace Q {
interface Deferred<T, R=any, N=any> {
reject(reason: R): void;
notify(value: N): void;
}
function defer<T, R=any, N=any>(): Deferred<T, R, N>;
}
}
Q.defer<string, string, number>();
关于typescript - 从包中修改命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45195975/