合并模块内的TypeScript接口

时间:2017-04-28 19:34:34

标签: typescript

我正在尝试合并来自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不再可用。

我错过了什么?

1 个答案:

答案 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而不是与其合并它