Node.js 在库中提供可扩展的Typescript接口

Node.js 在库中提供可扩展的Typescript接口,node.js,typescript,inheritance,interface,Node.js,Typescript,Inheritance,Interface,我正在用Typescript构建一个库,它应该支持第三方插件。库的构造函数应该接受核心库和所有插件的选项,因为模块将在构造函数中加载它们 是否有可能提供一个基本的Options接口,每个插件都可以扩展该接口来添加自己的属性和类型,以便在整个顶级应用程序(使用库和插件)中,Options接口同时反映核心选项和插件的选项 因此,对于这样的依赖结构: - user-app |- my-library |- my-library-plugin-a |- my-library-plugin-b inte

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

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

因此,对于这样的依赖结构:

- user-app
|- my-library
|- my-library-plugin-a
|- my-library-plugin-b
interface Options {
  coreOption : string;
  pluginA : boolean;
  pluginB : Record<string, string>;
}
其中
my library
定义了以下内容:

export interface Options {
  coreOption : string;
}
my-library-plugin-a
将其扩展如下:

export interface PluginAOptions extends Options {
  pluginA : boolean;
}
export interface PluginBOptions extends Options {
  pluginB : Record<string, string>;
}
my-library-plugin-b
将其扩展如下:

export interface PluginAOptions extends Options {
  pluginA : boolean;
}
export interface PluginBOptions extends Options {
  pluginB : Record<string, string>;
}
这就是他们的自动完成应该显示的内容,也是Typescript编译器应该检查的内容


Typescript是否可以实现这种功能?

您不能指望从
my library
中获得完整的扩展选项

这不是关于TypeScript,而是关于依赖关系如何工作。
我的库
对插件一无所知,它应该是这样的。 如果它能以某种方式导出插件添加的选项,它将依赖于这些插件,使得插件架构毫无意义

用户应用程序
中,您只需使用
plugin-a
plugin-b
中的选项并将它们组合起来即可

const theOption: PluginAOptions & PluginBOptions = { ... }
user app
是知道并决定使用
plugin-a
plugin-b
的用户。
这就是为什么它应该并且可以使用这些插件中的类型。

您不能期望从
我的库中获得完整的扩展选项

这不是关于TypeScript,而是关于依赖关系如何工作。
我的库
对插件一无所知,它应该是这样的。 如果它能以某种方式导出插件添加的选项,它将依赖于这些插件,使得插件架构毫无意义

用户应用程序
中,您只需使用
plugin-a
plugin-b
中的选项并将它们组合起来即可

const theOption: PluginAOptions & PluginBOptions = { ... }
user app
是知道并决定使用
plugin-a
plugin-b
的用户。
这就是为什么它应该并且可以使用这些插件中的类型。

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