使用通用参数

时间:2019-06-12 05:05:06

标签: typescript typescript-typings

我正在向我的JavaScript配置加载程序milieu添加打字稿声明。

该库导出名为milieu的函数,该函数在Config类型上是通用的。该函数返回Milieu的实例,该类型是Config和MilieuConstructor的合并(这是因为在JS实现中,Milieu类构造函数将每个config值复制到该实例中)。

使用导出的函数时,所有这些都可以正常工作,但是我们遇到了问题。 milieu函数还具有Milieu属性,该属性具有Milieu构造函数。我无法弄清楚如何在不与milieu名称空间发生冲突的情况下将此构造函数添加到导出的函数中。

declare namespace milieu {

  export interface Opts {
    argv?: string
    env?: { [s: string]: string }
    platform?: string
    cwd?: string
    unsetEnvValues?: boolean
    parseValues?: boolean
  }

  export class MilieuConstructor<Config> {
    constructor (applicationName: string, defaults: Config, opts?: Opts)
  }

  export type Milieu<Config> = Config & MilieuConstructor<Config>
}

declare function milieu<Config>(applicationName: string, defaults: Config, opts?: milieu.Opts): milieu.Milieu<Config>

export = milieu

我希望以下代码在输入时有效:

import milieu from 'milieu'

interface MyConfig {
  port: number
}

// This one currently works
const config1 = milieu<MyConfig>('myApplication', {
  port: 8000
});

// This one does not as milieu.Milieu does not exist as a value
const config2 = new milieu.Milieu<MyConfig>('myApplication', {
  port: 8000
});

这里是playground example

1 个答案:

答案 0 :(得分:2)

您可以添加Milieu值和类型。它必须是返回Milieu<Config>

的构造函数签名
declare namespace milieu {

    export interface Opts {
      argv?: string
      env?: { [s: string]: string }
      platform?: string
      cwd?: string
      unsetEnvValues?: boolean
      parseValues?: boolean
    }

    export class MilieuConstructor<Config> {
      constructor (applicationName: string, defaults: Config, opts?: Opts)
    }

    export type Milieu<Config> = Config & MilieuConstructor<Config>
    export const Milieu: new <Config>(applicationName: string, defaults: Config, opts?: Opts) => Milieu<Config>
  }

  declare function milieu<Config>(applicationName: string, defaults: Config, opts?: milieu.Opts): milieu.Milieu<Config>

  export = milieu