经过一番研究后,我设法将我的界面IRequestShortcutConfig
与@ types / angular提供的现有界面合并。
我创建了一个包含我的界面的单独文件:
// custom.d.ts
export {}; // Ensure this is treated as a module.
declare module 'angular' {
interface IRequestShortcutConfig {
tracker?: any;
}
}
第一个“专业”是根据https://github.com/Microsoft/TypeScript-Handbook/issues/258#issuecomment-213490734我们需要至少有一个顶级导出或导入语句。
如果您已经在ES6模块中,则只能扩充ES6模块。
为什么会这样?
我发现第二件事有点令人困惑的是,在DefinitelyTyped定义中,接口的定义如下:
declare namespace angular {
interface IRequestShortcutConfig extends IHttpProviderDefaults {
/**
* {Object.<string|Object>}
* Map of strings or objects which will be turned to ?key1=value1&key2=value2 after the url. If the value is not a string, it will be JSONified.
*/
params?: any;
/**
* {string|Object}
* Data to be sent as the request message data.
*/
data?: any;
/**
* Timeout in milliseconds, or promise that should abort the request when resolved.
*/
timeout?: number|IPromise<any>;
/**
* See [XMLHttpRequest.responseType]https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype
*/
responseType?: string;
}
}
然而,为了实际扩充命名空间接口,我们需要使用declare module 'angular'
而不是declare namespace angular
来包装界面,如本文问题开头的文件custom.d.ts
中所示。
来自Typescript-Handbook的引用:
关于术语的说明:重要的是要注意在TypeScript 1.5中,命名法已经改变。 “内部模块”现在是“命名空间”。 “外部模块”现在只是“模块”,以便与ECMAScript 2015的术语保持一致(即模块X {相当于现在首选的命名空间X {)。
所以'外部'模块只是一个“已导入”的模块?
它确实有效,但我想知道这是否是通过npm安装的扩展类型(@types)的正确方法?