如何在d.ts中扩充TypeScript接口

时间:2017-02-16 00:19:10

标签: typescript

我的使用案例:请求RequestResponse type definition缺少body属性,如下所示:

declare namespace request {

    // ...

    export interface RequestResponse extends http.IncomingMessage {
        request: Options;
    }

    // ...

}
declare var request: request.RequestAPI<request.Request, request.CoreOptions, request.RequiredUriUrl>;
export = request;

我试图通过使用以下内容创建request-fix.d.ts文件来修复它:

import * as http from 'http';
declare namespace request {
    export interface RequestResponse extends http.IncomingMessage {
        body: any;
    }
}

但它没有效果。我的最终目标是,在我的app.ts中,我可以这样做:

import * as rp from 'request-promise';
import { RequestResponse } from 'request';

let response = rp.get(url);

response.statusCode; // works
response.body; // doesn't compile

当然我可以贡献给DefinitelyTyped :)但是这个问题即将增加RequestResponse界面。

2 个答案:

答案 0 :(得分:8)

以下是适用于request-fix.d.ts的组合:

import * as http from 'http';

declare module 'request' {
    export interface RequestResponse extends http.IncomingMessage {
        body: any;
    }
}

要扩充现有模块,必须使用declare module而不是declare namespace,并且它必须出现在已编译源中的某个模块范围内。

也就是说,request-fix.d.ts必须在顶层进行一些导入才能将其转换为模块,就像在代码中使用import * as http from 'http'一样。如果declare module出现在非模块范围内(正如我在第一次尝试答案时所做的那样),它只是声明了here所描述的单独的,不相关的模块。

答案 1 :(得分:0)

@artem是对的,+ 1,只是想补充说你不应该忘记名称空间。

例如,这是className道具来自CardTitle的{​​{1}}组件:

material-ui

解释很简单。模块和命名空间仅存在于运行时并自动合并。