我的使用案例:请求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
界面。
答案 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
解释很简单。模块和命名空间仅存在于运行时并自动合并。