Node.js 在库中提供可扩展的Typescript接口
我正在用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
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添加的所有内容的统一类型。扩展插件中的类型当然很容易。但我正在寻找一种方法,让这些扩展“冒泡”到顶级程序。我更新了我的原始问题,试图让我的问题更清楚。谢谢你的回答!我想这是不可能的,但我想我会问一下,以防有办法实现这一点。谢谢你的回答!我想这是不可能的,但我想我会问一下,以防有办法实现这一点。