Я пытаюсь реорганизовать громоздкий конфигурационный интерфейс / объект, разделив его различные разделы на отдельные файлы под namespace
, который я ловко назвал Config
.
В документации говорится о пространствах имен, которые охватывают несколько файлов и объявление объединения интерфейсов , но я не могу заставить их работать вместе.
ЦСИ / конфигурации / index.ts
/// <reference path="./server.ts" />
import fs from 'fs';
import json5 from 'json5';
const _config = readConfig();
namespace Config {
export const config = _config;
export interface IConfig {
someGeneralProperty: {
// ...
}
}
}
function readConfig(): Config.IConfig {
return json5.parse(fs.readFileSync('./path/to/config.json', 'utf-8'));
}
function doSomeOtherStuff() {
// fails: Property 'server' does not exist on type 'IConfig'.
console.log(_config.server.host);
}
ЦСИ / конфигурации / server.ts
/// <reference path="./index.ts" />
namespace Config {
export interface IConfig {
server: {
host: string;
port: number;
}
}
}
ЦСИ / index.ts
// fails: Module '"./config"' has no exported member 'config'.
import { config } from './config';
// fails: Cannot use namespace 'Config' as a value.
// fails: Namespace 'Config' has no exported member 'config'.
import config = Config.config;
Я пробовал несколько вариантов экспорта, например export default Config;
, export namespace Config {...}
в каждом из файлов src/config/...
, меняя export const config
на export var config
. В src/config/index.ts
я пытался export * from './server'
. Кажется, ничто не помогает.
У меня такое чувство, что я все делаю неправильно.
Как ни странно, интерфейсы в пространстве имен в каждом файле экспортируются из пространства имен, поэтому в src/index.ts
я могу сделать:
import IConfig = Config.IConfig;
let c: IConfig;
console.log(c.server.host);
но я не могу сделать это ни в src/config/index.ts
, ни в src/config/server.ts
.