Я импортирую файл config.json и пытаюсь напечатать вывод из него. Мое приложение объединит default
с правильной средой в функции и вернет ее. Если передано недопустимое или неопределенное окружение, вы получите только конфигурацию default
.
Вот пример файла config.json:
{
"default" : {
"endpoint1": "https://example.com",
"endpoint2": "https://example.com"
},
"dev" : {
"endpoint3": "https://example.com",
"api_key":"key"
},
"uat" : {
"endpoint3": "https://example.com",
"api_key":"key"
},
"prod" : {
"endpoint3": "https://example.com",
"api_key":"key"
}
}
Вот функция, которая получает конкретную конфигурацию для нашего экземпляра.
import config from "src/js/config/config.json";
export type Environment = keyof typeof config;
export type EnvironmentConfig = typeof config.default & (typeof config.dev | typeof config.uat | typeof config.prod);
let localConfig: undefined | EnvironmentConfig;
function getForEnv(configJSON: typeof config, env: Environment | null): EnvironmentConfig {
// error thrown here because default does not have types from the specific environments.
// This type should always have default but may also have a specific environment.
localConfig = configJSON.default;
if (env !== null && configJSON[env]) {
localConfig = _.merge(localConfig, configJSON[env]);
}
return localConfig;
}
ОБНОВЛЕНИЕ 1
Я думал, что хитрость в том, чтобы добавить пустой тип объекта в дополнительные опции {}
. Это позволит ему не указывать никаких дополнительных свойств.
export type EnvironmentConfig = typeof config.default & ({} | typeof config.dev | typeof config.uat | typeof config.prod);
Однако эта ошибка не существует при попытке доступа к getForEnv(config, 'uat').endpoint3