我正在尝试合并来自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接口不再可用。
我错过了什么?
最佳答案
将import
语句添加到声明文件会将该.d.ts
文件转换为模块,并将文件中的所有声明“移动”到该模块的范围中。
因此namespace jasmine
文件中的.d.ts
与“real”namespace jasmine
不在同一范围内(很可能是在全局范围内),因此您的interface Matchers
也与realMatchers
在不同范围内,不同范围的声明不会合并。
当您在import
文件的顶层有export
或.d.ts
时,解决方案是在那里使用显式的global
作用域:
declare global {
namespace jasmine {
interface Matchers {
toBeSuccessful(): boolean;
}
}
}
有关参考,请参见declaration merging文档末尾的“全局增强”。
另外,当您在实现中添加
Matchers
接口时,它与实际的Matchers
在不同的范围内,并且它隐藏jasmineMatchers
,而不是与它合并。