typescript - TypeScript 是否能够根据另一个论点塑造一个论点?

标签 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 入口点应接受两个选项:

  • loaderLoaderInterface(具体类)的实例
  • 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
});

Playground link

注意:我们使用 T&{} 作为选项参数,以降低此推理站点的优先级,确保指定 T通过 loader 参数而不是 options

关于typescript - TypeScript 是否能够根据另一个论点塑造一个论点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52709127/

相关文章:

javascript - 泛型 : Type as property name

typescript - 使用用 Typescript 编写的 ConnectedComponentClass 类型 React-Redux

reactjs - 如何在输入占位符中使用 FormattedMessage

javascript - 使用符号链接(symbolic link)在多个 React 应用程序之间共享代码

typescript - 如何从对象键的嵌套对象创建映射的联合类型

javascript - 允许由另一个字段初始化字段吗?

javascript - 为什么 TS 不生成纯 JavaScript 代码,而是生成 Node.js 函数?

javascript - 当滚动太快时,白屏出现棱 Angular

typescript 不推断类型

Angular2 - 嵌套组件的编译问题