我正在尝试合并来自jasmine的Matchers界面。 接口在jasmine名称空间内声明。
我创建了.d.ts文件并添加了以下内容:
declare namespace jasmine {
interface Matchers {
toBeSuccessful(): boolean;
}
}
这样可行,但是如果我尝试将一个import语句添加到.d.ts文件中,它就不起作用了。无法识别 toBeSuccessful 功能。
我还试图将这部分代码添加到我的函数实现中,而不是在d.ts文件中,但是,命名空间的其他成员不再可用,例如在此代码中:
class ToBeSuccessfulMatcher implements jasmine.CustomMatcher {
compare<T>(actual: Result<T>): jasmine.CustomMatcherResult {
}
}
接口CustomMatcher和CustomMatcherResult不再可用。
我错过了什么?
答案 0 :(得分:2)
将import
语句添加到声明文件会将.d.ts
文件转换为模块,并且&#34;移动&#34;文件中的所有声明都进入该模块的范围。
因此namespace jasmine
文件中的.d.ts
与&#34;真实&#34;的范围不同namespace jasmine
(最有可能的是,这一个属于全局范围),因此您的interface Matchers
也与真实Matchers
的范围不同,并且不合并来自不同范围的声明
当您import
文件中的export
或.d.ts
位于顶层时,解决方案是在那里使用明确的global
范围:
declare global {
namespace jasmine {
interface Matchers {
toBeSuccessful(): boolean;
}
}
}
供参考,另见&#34;全球增强&#34;在declaration merging文件的最后。
此外,当您在实现中添加Matchers
接口时,它又会在与真实Matchers
不同的范围内,并且隐藏jasmine Matchers
而不是与其合并它