代码之家  ›  专栏  ›  技术社区  ›  gremo

TypeScript是否能够根据另一个参数形成一个参数?

  •  2
  • gremo  · 技术社区  · 6 年前

    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 这是一个例子 装载机接口 (混凝土等级)
    • options

    我的问题是我不知道如何在两个选项之间建立“连接”。

    如果 装载机 是这个吗,比 选项 应该是这个样子 . 可能吗?


    解决方法1:愚蠢,因为一个人可以把任何东西传给别人

    class MyModule {
      static create(loader: LoaderInterface, options: any) { }
    }
    

    解决方法二:也很傻,因为允许任何物体的形状 LoaderOptions (基本上,什么都可以):

    class MyModule {
      static create(loader: LoaderInterface, options: LoaderOptions) { }
    }
    
    MyModule.create(new SimpleLoader, { foo: 'bar' })
    

    class MyModule {
      static create(loader: LoaderInterface, options: SimpleLoaderOptions
        | AdvancedLoaderOptions) { }
    }
    
    MyModule.create(new SimpleLoader, { option1: 'foo', option2: 'bar' })
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Titian Cernicova-Dragomir    6 年前

    您可以使加载器接口通用。实现加载程序时,它将支持的选项指定为泛型参数。这个 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

    推荐文章