Это продолжение до Как использовать 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
Редактировать: третий вопрос решен - см. комментарий