我正在尝试合并来自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,而不是与它合并。

09-30 16:33