Как использовать node-config в машинописи с пользовательским интерфейсом конфигурации? - PullRequest
0 голосов
/ 06 марта 2020

Это продолжение до Как использовать node-config в машинописи? , так как я не смог найти правильный ответ.

Я относительно новичок в TS, и я ' Я пытаюсь преобразовать наши конфиги из json в машинописный текст, в то же время пытаясь включить типы в конфигурацию.

В настоящее время мы имеем что-то вроде:

// default.json
{
  "server": {
    "timeout": 10
  }
}

// some-code.ts
import config from 'config';
...
const serverTimeout = config.get<number>('server.timeout'); // 10

Здесь мы можем чтобы получить необходимые конфиги, но нам нужно указать тип с помощью обобщений в коде. Я пытаюсь включить (относительно) более сильную типизацию.

Dry преобразование:

// default.ts
import { MyConfig } from './config-schema.ts'

const conf: MyConfig = {
  "server": {
    "timeout": 10
  }
};

export default conf;

// config-schema.ts
export interface MyConfig {
  server: {
    timeout: number;
  }
}

// some-code.ts
import config from 'config';

console.log(config); // { "server": { "timeout": 10 } }
console.log(config.get<number>('server.timeout')); // 10
console.log((config as any).server.timeout); // 10
console.log(config.server.timeout); // obviously a compile time error.

Как видите, последняя форма НЕ будет работать и приведет к ОШИБКЕ времени компиляции. Я как-то хочу, чтобы config соответствовал форме MyConfig, чтобы config.server.timeout был возможен с сильным типом number.

Мне нужно каким-то образом расширить IConfig взаимодействовать с MyConfig или принудительно набрать от config до IConfig & MyConfig.

Моя попытка:

// config-schema.ts
import config from 'config';

interface MyConfig {
  server: {
    timeout: number;
  }
}

export (config as any as MyConfig);

// some-code.ts
import config from './config-schema';

console.log(config.server.timeout); // 10

Это работает, но почему-то не подходит мне .

Проблемы

  • Принудительно использовать any ... можно ли этого как-то избежать?
  • Нужно сделать что-то вроде import config from '../../core/config-schema'; -> выглядит некрасиво, путь для разных файлов различен, нужно, чтобы все соавторы проекта следовали соглашению ... возможно ли сохранить его как import config from 'config'; и иметь абстрагированный маги c?
  • Компилировать default.ts до default.js с tsc во время компиляции (чтобы машинопись не зависела от времени выполнения). Обновили env var NODE_CONFIG_DIR соответственно. В настоящее время я делаю это, но объект конфигурации создается с дополнительным уровнем иерархии. то есть вместо config.server.timeout он стал config.default.server.timeout

Редактировать: третий вопрос решен - см. комментарий

...