在模块内合并 TypeScript 接口

Posted

技术标签:

【中文标题】在模块内合并 TypeScript 接口【英文标题】:Merging TypeScript interfaces inside modules 【发布时间】:2017-09-27 00:20:27 【问题描述】:

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

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

declare namespace jasmine 
    interface Matchers 
        toBeSuccessful(): boolean;
    

这可行,但如果我尝试将导入语句添加到 .d.ts 文件,它就不起作用。 toBeSuccessful 功能无法识别。

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

class ToBeSuccessfulMatcher implements jasmine.CustomMatcher 
    compare<T>(actual: Result<T>): jasmine.CustomMatcherResult 
    

CustomMatcher 和 CustomMatcherResult 接口不再可用。

我错过了什么?

【问题讨论】:

【参考方案1】:

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

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

当您在 .d.ts 文件的顶层有 importexport 时,解决方案是在此处使用显式 global 范围:

declare global 
    namespace jasmine 
        interface Matchers 
            toBeSuccessful(): boolean;
        
    

有关参考,另请参阅declaration merging 文档末尾的“全局增强”。

此外,当您在实现中添加Matchers 接口时,它再次位于与真正的Matchers 不同的范围内,并且它隐藏了茉莉花Matchers 而不是与其合并。

【讨论】:

以上是关于在模块内合并 TypeScript 接口的主要内容,如果未能解决你的问题,请参考以下文章

与接口同名的 TypeScript 类

Typescript 接口合并以使返回类型更具体

合并/检索打字稿声明文件

在 TypeScript 中,如何使用 (a: type, b:type): any 实现接口?

typescript在@types中找不到模块

即使未导入 typescript 声明文件也会被处理