我的程序包支持多个加载程序,实现LoaderInterface
:
// tslint:disable-next-line:no-empty-interface
export interface LoaderOptions { }
export interface LoaderInterface {
load(options: LoaderOptions): Object;
}
export interface SimpleLoaderOptions extends LoaderOptions {
option1: string;
}
export interface AdvancedLoaderOptions extends LoaderOptions {
option2: string;
}
MyModule
入口点应接受两个选择:
loader
这是LoaderInterface
(具体类)的实例options
对象巫婆应该“匹配”相应的加载器选项我的问题是我不知道如何在两个选项之间创建“连接”。
我需要这样的东西:如果loader
是这样,那options
应该看起来像这样。可能?
解决方案1:愚蠢,因为有人可以将任何东西传递给options
参数:
class MyModule {
static create(loader: LoaderInterface, options: any) { }
}
解决方案2:也很愚蠢,因为允许任何形状为LoaderOptions
(基本上是任何东西)的物体:
class MyModule {
static create(loader: LoaderInterface, options: LoaderOptions) { }
}
MyModule.create(new SimpleLoader, { foo: 'bar' })
解决方案3:更好,但仍然可以“混合”选择。但是带有自定义选项的自定义加载程序呢?
class MyModule {
static create(loader: LoaderInterface, options: SimpleLoaderOptions
| AdvancedLoaderOptions) { }
}
MyModule.create(new SimpleLoader, { option1: 'foo', option2: 'bar' })
您可以使加载程序接口通用。实现加载程序时,它将指定它支持的选项作为通用参数。该create
方法将是通用的,并且将对加载器的类型参数和选项对象使用相同的类型参数,从而在它们之间建立链接
export interface LoaderOptions { }
export interface LoaderInterface<T extends LoaderOptions> {
load(options: T): Object;
}
export interface SimpleLoaderOptions extends LoaderOptions {
option1: string;
}
export interface AdvancedLoaderOptions extends LoaderOptions {
option2: string;
}
class MyModule {
static create<T extends LoaderOptions>(loader: LoaderInterface<T>, options: T & {}) {
}
}
class LoaderAdvanced implements LoaderInterface<AdvancedLoaderOptions> {
load(options: AdvancedLoaderOptions): Object {
return null as any;
}
}
let m = MyModule.create(new LoaderAdvanced(), {
option2: '' // required since we need AdvancedLoaderOptions
});
注意:我们使用T&{}
options参数是为了降低此推理站点的优先级,确保T
由loader
参数决定而不是由options
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句