我正在向我的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
});
答案 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