我的包支持多个加载器,实现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&{}
作为选项参数,以降低此推理站点的优先级,确保指定 T
通过 loader
参数而不是 options
关于typescript - TypeScript 是否能够根据另一个论点塑造一个论点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52709127/