使用声明合并普遍修补接口

Posted

技术标签:

【中文标题】使用声明合并普遍修补接口【英文标题】:Universally patching an interface with declaration merging 【发布时间】:2019-03-21 03:11:27 【问题描述】:

tl;dr - 我想将第三方输入的界面与我自己的界面合并,这样任何导入原始界面的人都会获得合并的界面。 这可能吗?


我正在开发一个用 javascript 和 AngularJS 编写的项目,我们已经开始改用 TypeScript。 有了这个,我们使用AngularJS typings from DefinitelyTyped,但我们想对其进行一些定制。 例如,我们想更改IController 接口,使$onInit()?: void 的定义变为$onInit(): void 以使其成为强制性。

我可以通过将声明与我自己的接口合并来实现这一点:

interface IController 
    $onInit(): void;

但我还没有想出如何将合并的接口应用于IController 的所有用途。 这很重要,因此我可以强制所有控制器都具有此功能,而不会让案例溜走,例如没有导入正确的接口。

这可以吗?如果有,怎么做?

PS:我尝试了很多不同的命名空间组合,但我在这方面不是太强,所以也许我还没有找到正确的咒语。

【问题讨论】:

【参考方案1】:

您不能将可选方法与必需方法合并。 (听起来到目前为止,您实际上还没有合并任何东西,只是声明了一个您的代码可以使用的单独接口,而不是原始的IController。)您必须为您的项目分叉@types/angular 类型;请参阅this answer 了解可能的执行方式的摘要。

【讨论】:

啊,这解释了为什么它当时似乎有效,尽管我可以发誓我在其他地方看到有人这样做。我希望我们不必分叉它,但我想这是生活。感谢您的帮助:)

以上是关于使用声明合并普遍修补接口的主要内容,如果未能解决你的问题,请参考以下文章

在数百万的谷歌三星和LG手机中发现的高通芯片漏洞,已修补

LayaBox---TypeScript---声明合并

查找接口实例背后的具体类型

TypeScript 声明合并 - 更改属性类型

Git将修补程序合并到多个分支

在 C++ 中使用多继承声明接口并实现接口