javascript - 通过打字稿中的动态键获取对象值
问题描述
我试图根据值仅导出配置对象的 1 个process.env.NODE_ENV
值,因此我试图获取configEnvs
变量的值,configEnvs['local']
但尝试访问对象的一个键时出现错误。我尝试使用 anenum
作为键来设置它的可能值,但它没有用。
我目前正在尝试获取键值,使用getKeyValue
该键值获取对象并将键值限制为仅对象的键,但随后它说string
我试图传递的键不可分配给可能的选项。
const getKeyValue = <T, K extends keyof T>(obj: T, key: K) => obj[key];
const { NODE_ENV, REACT_APP_ENV } = process.env;
interface IConfigEnv {
DB_DNS: string;
}
interface IConfig {
local: IConfigEnv;
development: IConfigEnv;
production: IConfigEnv;
}
let configEnvs: IConfig = {
local: {
DB_DNS: "https://localhost:4000",
},
development: {
DB_DNS: "https://my-dev.web.com",
},
production: {
DB_DNS: "https://api.web.com",
},
};
const nodeEnv = REACT_APP_ENV || NODE_ENV || "development";
const config: IConfigEnv = getKeyValue(configEnvs, nodeEnv);
export default config;
我收到此错误声明config
:
Argument of type 'string' is not assignable to parameter of type '"development" | "production" | "local"'.
解决方案
更安全的方法是使用类型保护或类型断言函数,如下所示:
interface IConfigEnv {
DB_DNS: string;
}
interface IConfig {
local: IConfigEnv;
development: IConfigEnv;
production: IConfigEnv;
}
const acceptableEnvs = [ "local", "development", "production" ];
function assertEnv(k: any): asserts k is keyof IConfig {
if (typeof k !== "string" || !acceptableEnvs.includes(k)) {
throw new Error(
`Environment must be one of '${acceptableEnvs.join("', '")}'. You passed '${k}'.`
);
}
}
const config: IConfig = {
local: {
DB_DNS: "https://localhost:4000",
},
development: {
DB_DNS: "https://api-dev.web.com",
},
production: {
DB_DNS: "https://api.web.com",
},
};
const nodeEnv = process.env.REACT_APP_ENV || process.env.NODE_ENV || "development";
assertEnv(nodeEnv);
export default config[nodeEnv];
请注意,如果您只是简单地对错误的运行时值进行类型转换,此解决方案会明确说明您的应用程序会引发的错误,从而为您提供更多的控制和对流程的确定性。也就是说,如果/当它被抛出时,你仍然必须确保对该错误进行处理。
推荐阅读
- android - Flutter 安装在 Windows 10、Android 3.6.3 上,但未显示创建新的 Flutter 项目,尽管按照文档安装
- sql - 在 SQL 表、teradata 中插入行时出现问题
- docker - 如何获取 Docker 容器和 Kubernetes pod 中的应用程序指标
- python - 使用 Python 的 Geoserver Web 缓存
- node.js - Angular PWA 错误在 ngsw-cache-bust 上获取清单
- ssl - 通过 tshark 或 wireshark 提取 SSL 会话中具有自签名证书的 ip
- javascript - 对数据表中的列进行排序
- xamarin - 交换页面底部和标题
- node.js - 为什么随机数为 0 的交易在以太坊中失败?
- javascript - 只有一个字符串允许在极简主义?