在模块内合并 TypeScript 接口

thi*_*ple 4 typescript

我正在尝试从 jasmine 合并 Matchers 界面。该接口在 jasmine 命名空间内声明。

我创建了 .d.ts 文件并添加了以下内容:

declare namespace jasmine {
    interface Matchers {
        toBeSuccessful(): boolean;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但如果我尝试向 .d.ts 文件添加导入语句,则它不起作用。该toBeSuccessful功能无法识别。

我还尝试在我的函数实现中添加这部分代码,而不是在 d.ts 文件中,但是,命名空间的其他成员不再可用,例如在此代码中:

class ToBeSuccessfulMatcher implements jasmine.CustomMatcher {
    compare<T>(actual: Result<T>): jasmine.CustomMatcherResult {
    }
}
Run Code Online (Sandbox Code Playgroud)

接口 CustomMatcher 和 CustomMatcherResult 不再可用。

我错过了什么?

art*_*tem 6

import在声明文件中添加语句将该.d.ts文件变成一个模块,并将文件中的所有声明“移动”到该模块的范围内。

因此namespace jasmine,您的.d.ts文件不再与“真实”处于同一范围内namespace jasmine(最有可能的是,该文件在全局范围内),因此您interface Matchers的范围也与 real 不同Matchers,并且不会合并来自不同范围的声明

当您在文件中拥有importexport处于顶级时,解决方案.d.ts是在global那里使用显式范围:

declare global {
    namespace jasmine {
        interface Matchers {
            toBeSuccessful(): boolean;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

作为参考,另请参阅声明合并文件最后的“全局扩充” 。

此外,当您Matchers在实现中添加interface时,它再次位于与 real 不同的范围内Matchers,并且它隐藏了 jasmineMatchers而不是与它合并。