【问题标题】:Provide extendable Typescript interface in library在库中提供可扩展的 Typescript 接口
【发布时间】:2019-11-17 09:02:47
【问题描述】:

我正在使用 Typescript 构建一个应该支持第三方插件的库。库的构造函数应该接受核心库和所有插件的选项,因为模块将在构造函数中加载它们。

是否可以提供一个基本的Options 接口,每个插件都可以扩展它以添加自己的属性和类型,以便在整个顶级应用程序(使用库和插件)中,Options 接口反映核心选项和插件选项?

所以有了这样的依赖结构:

- user-app
|- my-library
|- my-library-plugin-a
|- my-library-plugin-b

my-library 定义如下:

export interface Options {
  coreOption : string;
}

my-library-plugin-a 将其扩展如下:

export interface PluginAOptions extends Options {
  pluginA : boolean;
}

my-library-plugin-b 扩展如下:

export interface PluginBOptions extends Options {
  pluginB : Record<string, string>;
}

对于 user-app 的开发人员,它的依赖项中包含所有三个模块,从 my-library 导出的 Options 接口应如下所示:

interface Options {
  coreOption : string;
  pluginA : boolean;
  pluginB : Record<string, string>;
}

这就是他们的自动完成应该显示的内容,以及 Typescript 编译器应该检查的内容。

Typescript 可以实现这样的事情吗?

【问题讨论】:

  • @Li357 我问题中的关键词是“第三方”。换句话说,我不能将类型提取到共享模块中,因为我不是唯一拥有类型的人。其他开发人员应该能够制作插件并根据需要将它们发布到 npm。
  • 好的,然后从您的库中导出您的类型,以便可以导入和扩展它们。
  • 我的观点是插件 A 和插件 B 都应该从核心库扩展类型,并且所有三个模块的用户应该看到包含核心和插件 A 和 B 添加的所有内容的统一类型。只是扩展插件中的类型当然很容易做到。但我正在寻找一种方法让这些扩展“冒泡”到顶级程序。
  • 我已经更新了我原来的问题,试图让我的问题更清楚。

标签: node.js typescript inheritance interface


【解决方案1】:

您不能期望从my-library 获得全部扩展选项。

这不是关于 TypeScript,而是关于依赖如何工作的。 my-library 对插件一无所知,它应该知道。 如果它以某种方式可以导出插件添加的选项,它将取决于这些插件,从而使插件架构毫无意义。

user-app 中,您应该简单地使用plugin-aplugin-b 中的选项并将它们组合起来。

const theOption: PluginAOptions & PluginBOptions = { ... }

user-app 是知道并决定使用plugin-aplugin-b 的人。 这就是为什么它应该并且可以使用这些插件中的类型。

【讨论】:

  • 感谢您的回答!我认为这是不可能的,但我想我会问一下,以防万一毕竟有办法实现这一点。
猜你喜欢
  • 2017-10-21
  • 2016-07-06
  • 2020-10-30
  • 2020-06-09
  • 2020-04-09
  • 2018-06-20
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多