Единственное, что сходу приходит в голову - это взять какой-то объект конфига за основу и сравнивать остальные с ним, а так как у нас нет явного указания какие свойства у конфига есть, то непонятно, что брать за основу. Возможно, есть какой-то более адекватный вариант, но рабочий придумал только такой:
type CommonConfig = Record<string, any>;
const createConfig = <
Common extends CommonConfig,
Configs extends Record<string, ProductionConfig> & {
production: ProductionConfig;
},
ProductionConfig = Configs["production"] & Partial<Common>,
>(
common: Common,
configs: {
[env in keyof Configs]: Configs[env];
}
) => ({});
Т.е. мы требуем, чтобы в конфиге был конфиг "production" и все остальные конфиги сравниваем с ним, ну и плюс он может содержать опционально свойства дефолтного конфига.
Такой вариант рабочий, но вообще, для валидации конфигов я бы взял
zod