从包修改命名空间

时间:2017-07-19 16:18:32

标签: typescript namespaces

我正在使用我想修改的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);

1 个答案:

答案 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的其他用途不需要额外参数

更新1

@Sandy Gifford said

  

为简洁起见,我省略了使用Q的{​​{1}}位的修改。我已编辑了我的问题以包含它们。这似乎仍然无效 - 调用Deferred仍然会引发异常。

您仍需要为添加到Q.defer<string, string, number>()函数的任何其他通用类型提供默认参数。我不确切知道你的项目是如何布局的,但这样的事情对我来说很有用,模块增加:

defer