如何为.env.example文件中的字面量键添加TypeScript类型?
实现方案
当然可以实现,下面是具体的方案,能让你的TypeScript类型和.env.example完全同步:
1. 写脚本自动从.env.example提取键生成类型文件
因为.env.example是纯文本格式,没法直接像JSON那样导入,所以我们可以写个简单的Node脚本,解析文件里的环境变量键,自动生成对应的TypeScript类型定义。
比如创建generate-env-types.js文件:
const fs = require('fs'); const path = require('path'); // 读取.env.example文件 const envExamplePath = path.resolve(__dirname, '.env.example'); const content = fs.readFileSync(envExamplePath, 'utf8'); // 匹配环境变量键:忽略注释行,提取key=value格式里的key const envKeys = content.split('\n') .map(line => line.trim()) .filter(line => line && !line.startsWith('#')) .map(line => line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=/)?.[1]) .filter(Boolean); // 生成类型定义内容 const typeContent = ` // 自动生成的环境变量键类型,请勿手动修改 export type EnvKey = ${envKeys.map(key => `'${key}'`).join(' | ')}; `; // 写入类型文件 const typeOutputPath = path.resolve(__dirname, 'env-types.d.ts'); fs.writeFileSync(typeOutputPath, typeContent.trim()); console.log(`已生成环境变量类型:${typeOutputPath}`);
运行这个脚本后,会生成env-types.d.ts,内容示例:
// 自动生成的环境变量键类型,请勿手动修改 export type EnvKey = 'PORT' | 'DB_URL' | 'API_KEY';
2. 配置自动执行脚本
为了让.env.example更新时自动同步类型,可以在package.json里添加相关脚本:
{ "scripts": { "generate-env-types": "node generate-env-types.js", "watch-env-types": "nodemon --watch .env.example --exec \"npm run generate-env-types\"" } }
- 运行
npm run generate-env-types可手动生成最新类型 - 运行
npm run watch-env-types会监听.env.example的变化,自动更新类型文件 - 也可以把
generate-env-types加到你的构建脚本里,确保每次构建前类型都是最新的
3. 写安全的环境变量获取函数
用生成的EnvKey类型约束函数参数,确保只能访问.env.example里定义的键,还能做类型转换和缺失检查:
import type { EnvKey } from './env-types'; export function getEnv<K extends EnvKey>(key: K): string; export function getEnv<K extends EnvKey>(key: K, defaultValue: string): string; export function getEnv<K extends EnvKey>(key: K, defaultValue?: string): string { const value = process.env[key]; if (value !== undefined) return value; if (defaultValue !== undefined) return defaultValue; throw new Error(`环境变量 ${key} 未设置,请检查.env文件`); } // 合法用法:TypeScript会自动提示合法键并校验 const port = getEnv('PORT'); const apiKey = getEnv('API_KEY', 'default-key'); // 错误示例:传了不在.env.example里的键,TypeScript直接报错 const invalidKey = getEnv('INVALID_KEY');
这样一来,只要更新.env.example并同步执行脚本(或通过监听自动更新),TypeScript就能实时感知到键的变化,而且getEnv函数只能访问合法的环境变量键,避免拼写错误或使用未定义的变量。
内容的提问来源于stack exchange,提问作者eJunior
相关产品推荐
相关产品推荐

