TypeScript необязательный тип объединения - PullRequest
1 голос
/ 16 мая 2019

Я импортирую файл 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

...