首页 > 解决方案 > TypeScript 可选联合类型

问题描述

我正在导入一个 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

标签: jsontypescriptunion-typesoptional-typing

解决方案


推荐阅读