如何实现支持任意枚举的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
相关产品推荐
相关产品推荐

