Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript是否能够基于另一个参数形成参数?_Typescript - Fatal编程技术网

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在大多数情况下都能推断出它。惊人的语言和惊人的答案:)