You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现支持任意枚举的TypeScript通用配置获取函数?

实现支持任意枚举的通用环境配置获取函数

问题分析

你需要的是一个通用函数,接收包含环境变量键名的枚举,返回对应环境变量值的对象,且TypeScript能在解构不存在的键时抛出类型错误。原写法的泛型约束T extends string[]不符合枚举的类型特征,需要调整泛型逻辑适配枚举类型。

正确的通用实现

enum PackageAEnvs {
  API_KEY = "API_KEY"
}

enum PackageBEnvs {
  ADMIN_URL = "ADMIN_URL"
}

// 通用函数实现
const getConfiguration = <T extends Record<string, string>>(enums: T) => {
  // 提取枚举的所有值作为键的联合类型
  type EnvKeys = T[keyof T];
  const config = {} as Record<EnvKeys, string>;

  // 遍历枚举的每个键值对,验证并获取环境变量
  for (const key in enums) {
    const envKey = enums[key];
    const envValue = process.env[envKey];
    if (!envValue) {
      throw new Error(`环境变量 ${envKey} 未定义`);
    }
    config[envKey] = envValue;
  }

  return config;
};

// 使用示例
const packageAConfig = getConfiguration(PackageAEnvs);
const { API_KEY } = packageAConfig; // 正常,无类型错误
const { randomKey } = packageAConfig; // TypeScript报错:类型“Record<PackageAEnvs.API_KEY, string>”上不存在属性“randomKey”

const packageBConfig = getConfiguration(PackageBEnvs);
const { ADMIN_URL } = packageBConfig; // 正常
const { anotherKey } = packageBConfig; // TypeScript报错

关键细节说明

  • 泛型约束:T extends Record<string, string>确保传入参数是字符串值的枚举(TypeScript枚举编译后本质是键值对对象)。
  • 类型提取:type EnvKeys = T[keyof T]自动提取枚举的所有值,得到环境变量键名的联合类型(比如PackageAEnvs对应"API_KEY")。
  • 类型断言:config = {} as Record<EnvKeys, string>强制指定返回对象的严格结构,避免TypeScript推断为宽松的{}类型,保证解构时的类型检查生效。
  • 运行时验证:遍历枚举值时检查环境变量是否存在,不存在则抛出运行时错误,兼顾类型安全与运行时可靠性。

对比原固定版本

原固定版本通过type Conf = "K1" | "K2"手动指定键名,通用版本通过泛型自动从枚举提取键类型,无需重复定义,同时支持任意符合结构的枚举,复用性更强。

内容的提问来源于stack exchange,提问作者Thibault LR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:50:37