Как можно объединить интерфейсы машинописи в нескольких файлах в одном пространстве имен - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь реорганизовать громоздкий конфигурационный интерфейс / объект, разделив его различные разделы на отдельные файлы под 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...