Configuración de aplicaciones TypeScript: revisión de herramientas y bibliotecas
Una aplicación TypeScript moderna rara vez funciona de forma aislada. Necesita saber a qué base de datos conectarse, qué puerto usar, dónde se encuentran las API de terceros y cómo comportarse en diferentes entornos (development, staging, production). Una configuración adecuada no es solo almacenar ajustes, sino una disciplina completa que incluye validación, tipificación y seguridad.
En este artículo, analizaremos las herramientas y bibliotecas clave para la gestión de configuraciones en proyectos TypeScript, desde soluciones simples hasta estándares industriales.
¿Por qué se necesita una configuración separada?
Existen varios enfoques para almacenar ajustes, y cada uno tiene desventajas:
- Hardcode en el código fuente — viola el principio de 12-factor app, la configuración se mezcla con el código, imposible cambiar el comportamiento sin recompilar.
- Variables de entorno (process.env) — método estándar, pero todos los valores son cadenas, no hay validación, es fácil cometer un error tipográfico.
- Archivos JSON/YAML — son convenientes, pero deben versionarse con cuidado para no exponer secretos en el repositorio.
TypeScript agrega una capa adicional: queremos que la configuración esté estrictamente tipificada y que los errores se detecten en tiempo de compilación, no en tiempo de ejecución.
Bibliotecas para trabajar con variables de entorno
dotenv
La biblioteca más popular para cargar variables desde archivos .env. En proyectos TypeScript se usa casi siempre.
// npm install dotenv @types/dotenvimport dotenv from 'dotenv';
dotenv.config(); // carga .env en process.env
console.log(process.env.PORT); // '3000' — cadenaCaracterísticas:
- Funciona con cualquier framework (Express, NestJS, Next.js).
- Soporta múltiples archivos (
.env.local,.env.production). - No realiza validación — solo carga.
env-var
Una capa sobre process.env que agrega validación y conversión de tipos directamente en tiempo de ejecución.
// npm install env-varimport env from 'env-var';
export const config = { PORT: env.get('PORT').required().asPortNumber(), DB_HOST: env.get('DB_HOST').required().asString(), DEBUG: env.get('DEBUG').default('false').asBool(), API_KEYS: env.get('API_KEYS').asArray()};Ventajas: API simple, convertidores integrados (número, puerto, booleano, array).
Desventajas: no hay integración con TypeScript a nivel de tipos — el resultado sigue siendo string | number | boolean.
Soluciones industriales: convict y node-config
Convict
Biblioteca para describir un esquema de configuración con validación, valores predeterminados y soporte para múltiples fuentes (archivos, env, argumentos de línea de comandos).
// npm install convict @types/convictimport convict from 'convict';
const config = convict({ env: { format: ['production', 'development', 'test'], default: 'development', env: 'NODE_ENV' }, server: { port: { format: 'port', default: 3000, env: 'PORT' } }, db: { host: { format: String, default: 'localhost', env: 'DB_HOST' } }});
config.validate({ allowed: 'strict' }); // lanzará un error si los datos no son válidos
export default config;Características de convict:
- Formatos integrados:
port,email,url,int,nat(número natural). - Lectura automática desde
process.envy archivos JSON. - Soporte para esquemas anidados.
- Desvent
También en la biblioteca
MetricsKit — monitoreo de aplicaciones Swift (iOS/macOS)
Generador de códigos QR en C# (.NET) con QRCoder