在模块内合并 TypeScript 接口
Posted
技术标签:
【中文标题】在模块内合并 TypeScript 接口【英文标题】:Merging TypeScript interfaces inside modules 【发布时间】:2017-09-27 00:20:27 【问题描述】:我正在尝试从 jasmine 中合并 Matchers 界面。 接口在 jasmine 命名空间内声明。
我创建了 .d.ts 文件并添加了以下内容:
declare namespace jasmine
interface Matchers
toBeSuccessful(): boolean;
这可行,但如果我尝试将导入语句添加到 .d.ts 文件,它就不起作用。 toBeSuccessful 功能无法识别。
我还尝试将这部分代码添加到我的函数实现中,而不是 d.ts 文件中,但是随后,命名空间的其他成员不再可用,例如在此代码中:
class ToBeSuccessfulMatcher implements jasmine.CustomMatcher
compare<T>(actual: Result<T>): jasmine.CustomMatcherResult
CustomMatcher 和 CustomMatcherResult 接口不再可用。
我错过了什么?
【问题讨论】:
【参考方案1】:在声明文件中添加import
语句会将.d.ts
文件变成一个模块,并将文件中的所有声明“移动”到该模块的范围内。
因此,.d.ts
文件中的 namespace jasmine
不再与“真实”namespace jasmine
处于同一范围内(很可能是在全局范围内),因此您的 interface Matchers
也在与真正的Matchers
不同的范围,并且来自不同范围的声明不会合并。
当您在 .d.ts
文件的顶层有 import
或 export
时,解决方案是在此处使用显式 global
范围:
declare global
namespace jasmine
interface Matchers
toBeSuccessful(): boolean;
有关参考,另请参阅declaration merging 文档末尾的“全局增强”。
此外,当您在实现中添加Matchers
接口时,它再次位于与真正的Matchers
不同的范围内,并且它隐藏了茉莉花Matchers
而不是与其合并。
【讨论】:
以上是关于在模块内合并 TypeScript 接口的主要内容,如果未能解决你的问题,请参考以下文章