Cuando trabajamos con TypeScript, es habitual que hasta ahora hayamos manejado módulos internos, es decir, aquellos que creamos dentro de nuestro propio proyecto y que importamos usando rutas relativas. Sin embargo, limitarse a nuestro código local no es necesario cuando contamos con NPM, un repositorio enorme de paquetes que otros desarrolladores han creado y publicado para que podamos reutilizarlos sin tener que reinventar la rueda.
NPM funciona como una biblioteca gigante en línea desde donde podemos descargar módulos listos para usar. Por ejemplo, si queremos montar un servidor web con Node, no hace falta que programemos todo desde cero, como la gestión de sockets TCP. Podemos simplemente instalar Express, un framework muy popular que nos facilita esta tarea. Solo con un npm install y un import, ya tenemos un servidor funcionando.
Pero no solo para servidores, también existen librerías que nos ayudan con tareas más específicas. Por ejemplo, si queremos comprobar tipos en tiempo de ejecución, podemos usar paquetes como iswat. Esta librería nos ofrece funciones que devuelven true o false según si un valor cumple ciertas condiciones, como si es un número impar o si es una cadena de texto. Instalarla es tan sencillo como ejecutar npm install --save iswat y luego importarla en nuestro código.
Lo interesante es que muchos de estos paquetes están escritos en TypeScript, lo que significa que podemos aprovechar sus definiciones de tipos para tener autocompletado y chequeo estático sin problemas. Por ejemplo, al importar funciones como isString, isBoolean o isDate desde iswat, podemos usarlas directamente para validar valores con la seguridad que nos da TypeScript.
import { isString, isBoolean, isDate } from 'iswat';
const payload: unknown = "Hola mundo";
if (isString(payload)) {
console.log("Es una cadena de texto");
}
if (isBoolean(payload)) {
console.log("Es un booleano");
}
if (isDate(payload)) {
console.log("Es una fecha");
}
Además, iswat incluye funciones como isOdd para saber si un número es impar, o isFunction para comprobar si un valor es una función. Esto nos permite escribir código más limpio y seguro sin tener que implementar estas comprobaciones nosotros mismos.
Cuando trabajamos con fechas, la clase nativa Date de JavaScript puede ser complicada y poco intuitiva para operaciones comunes como calcular diferencias entre fechas o convertirlas a distintos formatos. Por suerte, existen librerías como Moment o date-fns que simplifican mucho estas tareas. Por ejemplo, con date-fns podemos restar dos fechas y obtener la diferencia en horas, minutos o segundos, lo que es muy útil para casos prácticos como calcular facturas basadas en horas trabajadas.
import { differenceInHours, parseISO } from 'date-fns';
const start = parseISO('2023-08-22T08:00:00Z');
const end = parseISO('2023-08-24T16:00:00Z');
const hoursWorked = differenceInHours(end, start);
const hourlyRate = 50;
const total = hoursWorked * hourlyRate;
console.log(`Total a pagar: ${total} euros`);
Sin embargo, no todo es perfecto al importar módulos externos. A veces podemos encontrarnos con errores de tipado, como cuando intentamos importar una función que no tiene definiciones de tipos disponibles. Por ejemplo, al importar isOdd de iswat, puede que TypeScript nos avise de que no encuentra un archivo de declaración para esa función. Esto ocurre porque no todos los paquetes incluyen sus tipos o no están correctamente configurados para TypeScript.
Para entender mejor este tipo de problemas, es útil revisar el contenido de la carpeta node_modules y ver cómo están estructurados los archivos y las definiciones de tipos. Esto nos ayuda a comprender cómo los módulos de NPM se integran con TypeScript y qué hacer cuando nos topamos con errores de tipado, como buscar paquetes de tipos adicionales o crear nuestras propias definiciones.
En definitiva, aprovechar los módulos de NPM en TypeScript nos permite acelerar el desarrollo, usar código probado y mantener nuestro proyecto más limpio y mantenible, siempre teniendo en cuenta cómo manejar correctamente las definiciones de tipos para evitar errores y aprovechar al máximo las ventajas de TypeScript.