2

我将 typescript 声明添加到我的 JavaScript 配置加载器环境中

该库导出了一个名为 milieu 的函数,该函数在类型 Config 上是通用的。该函数返回一个 Milieu 的实例,它是 Config 和 MilieuConstructor 的合并类型(这是因为在 JS 实现中 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
});

这是一个游乐场示例

4

1 回答 1

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
于 2019-06-12T05:23:18.717 回答