我正在使用我想修改的Q
安装的def类型。
.d.ts
有一个相当柔和的reject
,它不允许您指定Deferred
上传递给Defferred
的参数的类型。 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;
}
// ...
}
的界面如下所示:
global.d.ts
使用普通接口,您可以在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>;
}
文件中删除这样的内容:
Q
让它将该界面和功能合并回.d.ts
中@types
const def = Q.defer<string, string, number()
中的界面和功能。通过调用Supplied parameters do not match any signature of call target.
来测试此问题会引发char *buf = malloc(PAGE_SIZE);
pread(fd, buf, PAGE_SIZE, nth * PAGE_SIZE);
。
答案 0 :(得分:1)
你可以这样做:
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
的其他用途不需要额外参数
@Sandy Gifford said:
为简洁起见,我省略了使用
Q
的{{1}}位的修改。我已编辑了我的问题以包含它们。这似乎仍然无效 - 调用Deferred
仍然会引发异常。
您仍需要为添加到Q.defer<string, string, number>()
函数的任何其他通用类型提供默认参数。我不确切知道你的项目是如何布局的,但这样的事情对我来说很有用,模块增加:
defer