json - 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
解决方案
推荐阅读
- python - 相对于其他数据框中的 bin 值从数据框中提取行(不使用列名)
- c# - 为什么当我更改 DropDownList 上的选择时没有触发事件?
- python-3.x - 如何将控制台输出转换为 txt 文件(使用 python 烧瓶服务器)
- node.js - 这个场景如何实现:调用serverA上的api自动去serverB运行请求,返回response给serverA
- java - 将 TIMESTAMP 列从 PostgreSQL 映射到 LocalDate
- java - 如何将 byte[] 转换为 Java 中字节码的文本表示?
- visual-studio-code - 当我按下 Ctrl + P 时,我可以配置 VS Code 以复制选择和搜索吗?
- google-chrome-extension - Chrome 扩展通过比较 URL 来提供反馈
- debugging - VS17 Professional 15.7.5 在 ashx 文件中悬停调试时不显示变量
- javascript - 如何处理鼠标和键盘的点击事件?