TypeScript是否能够基于另一个参数形成参数?
我的软件包支持多个加载程序,实现TypeScript是否能够基于另一个参数形成参数?,typescript,Typescript,我的软件包支持多个加载程序,实现加载接口: //tslint:禁用下一行:无空接口 导出接口加载选项{} 导出接口装入器接口{ 加载(选项:加载选项):对象; } 导出接口SimpleLoaderOptions扩展LoaderOptions{ 选项1:字符串; } 导出接口AdvancedLoaderOptions扩展LoaderOptions{ 选项2:字符串; } MyModule入口点应接受两个选项: loader是LoaderInterface(具体类)的实例 选项对象开关应“匹配”
加载接口
:
//tslint:禁用下一行:无空接口
导出接口加载选项{}
导出接口装入器接口{
加载(选项:加载选项):对象;
}
导出接口SimpleLoaderOptions扩展LoaderOptions{
选项1:字符串;
}
导出接口AdvancedLoaderOptions扩展LoaderOptions{
选项2:字符串;
}
MyModule
入口点应接受两个选项:
是loader
(具体类)的实例LoaderInterface
对象开关应“匹配”相应的加载程序选项选项
loader
是这样,那么options
应该是这样的。可能吗?
解决方案1:愚蠢,因为可以将任何内容传递给
选项参数:
类MyModule{
静态创建(装入器:装入器接口,选项:任意){}
}
解决方案2:也很愚蠢,因为允许任何具有加载选项
形状的对象(基本上是任何对象):
类MyModule{
静态创建(装入器:装入器接口,选项:装入器选项){}
}
create(新的SimpleLoader,{foo:'bar'})
解决方案3:更好,但仍然可以“混合”选项。但是,使用自定义选项的自定义加载程序呢
类MyModule{
静态创建(加载程序:加载接口,选项:SimpleLoaderOptions
|高级加载选项{}
}
创建(新的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):对象;
}
导出接口SimpleLoaderOptions扩展LoaderOptions{
选项1:字符串;
}
导出接口AdvancedLoaderOptions扩展LoaderOptions{
选项2:字符串;
}
类MyModule{
静态创建(加载程序:加载接口,选项:T&{}){
}
}
类LoaderAdvanced实现LoaderInterface
注意:我们使用T&{}
作为选项参数,以降低此推理站点的优先级,确保T
由loader
参数指定,而不是options
出于兴趣,是T&}
为了降低优先级,我有两个问题要问:我甚至不能完全理解你的t&{}
甚至连你的笔记都看不懂,即使忽略了它也似乎很管用。第二个问题是:为什么我们可以调用MyModule.create
而不传递T
?TypeScript如何理解这一点?@gremo它记录在一些github问题中,我现在找不到。在没有&{}
的情况下,尝试将{}
传递给创建
函数。您不会得到任何错误,因为T
将被推断为{}
。我们不需要显式地指定类型参数,Typescript在大多数情况下都能推断出它。惊人的语言和惊人的答案:)