TypeScript是否可以基于另一个参数来调整参数?

我们走吧

我的程序包支持多个加载程序,实现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参数是为了降低此推理站点的优先级,确保Tloader参数决定而不是由options

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Swift中是否可以将一个函数作为另一个函数的参数来调用?

是否可以将构造函数用作TypeScript中另一个函数的参数类型?

给定类型的Require参数基于TypeScript中的另一个参数

我可以基于另一个参数的_value_强制一个参数吗?

创建一个函数来获取另一个函数的参数输入

发送一个代理参数来影响 Anylogic 中的另一个代理

基于另一个参数的条件where子句

是否有将对象参数映射到 TypeScript 中另一个对象的简写?

检查是否可以使用另一个函数的参数调用该函数

是否可以使用带有参数的bash别名并追加另一个命令?

是否可以在 SSRS 的不同场合从另一个下拉参数中获取 2 个参数的值?

用另一个模板中的参数来固化模板

Joomla 3参数来自另一个模板

逻辑悖论 - 自定义函数 - 参数来自另一个函数

如果需要转换,是否可以在将参数移至另一个参数的同时读取它?

是否可以使用 Javascript 中的另一个函数来停止循环?

基于另一个参数向argparse添加参数的Python方法

Scala:基于相同层次结构的另一个类型参数值限制参数

具有基于另一个参数的默认参数的函数

如何使用基于另一个参数的对象列表中的参数?(JavaScript)

如何基于SSRS中的另一个参数填充多值参数

基于另一个参数约束参数类型的最有效方法

基于另一个参数的打字稿函数参数类型

基于另一个参数值的条件参数类型

使用提供给另一个命令的参数来别名化一个命令

Javascript Generator:如何获取一个对象作为参数来生成另一个对象?

我可以使用 jq 来使用 JSON 文件中的参数来过滤和修改另一个 JSON 文件吗?

如何将模板参数固定为基于另一个模板参数的一个枚举类?

根据TypeScript中的另一个通用参数推断通用类型参数