Módulos desde NPM

Retomamos lo de los módulos para explicar las consecuencias de usar TypeScript a la hora de descargar módulos desde NPM.

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.

Lista de reproducción
  1. 1
    Temporada 1
    5 minutos
  2. 2
    ¿Qué es TypeScript?
    11 minutos
  3. 3
    Instalando TypeScript
    8 minutos
  4. 4
    Compilando un Hola Mundo sencillo
    7 minutos
  5. 5
    Hola Mundo pero con tipos
    10 minutos
  6. 6
    Tipos: tipos primitivos
    12 minutos
  7. 7
    Tipos: tipos especiales (any, null, ...)
    10 minutos
  8. 8
    Tipos: arrays y tuplas
    11 minutos
  9. 9
    Tipos: objetos
    7 minutos
  10. 10
    Funciones: lo básico
    9 minutos
  11. 11
    Funciones: tipando funciones
    9 minutos
  12. 12
    Clases: introducción a las clases
    9 minutos
  13. 13
    Clases: creando una clase
    10 minutos
  14. 14
    Clases: modificador private
    8 minutos
  15. 15
    Clases: modificador readonly
    3 minutos
  16. 16
    Clases: Atributos virtuales con getters y setters
    10 minutos
  17. 17
    Clases: herencia
    9 minutos
  18. 18
    Clases: modificadores abstract y protected
    8 minutos
  19. 19
    Tipos alias
    6 minutos
  20. 20
    Tipos literales
    5 minutos
  21. 21
    Uniones de tipos
    7 minutos
  22. 22
    Uniones discriminantes
    7 minutos
  23. 23
    Intersecciones de tipos
    5 minutos
  24. 24
    Interfaces: introducción
    7 minutos
  25. 25
    Interfaces: modificadores y funciones
    9 minutos
  26. 26
    Interfaces: usándolas con clases
    8 minutos
  27. 27
    Interfaces: herencia de interfaces
    8 minutos
  28. 28
    Interfaces: interfaces indizadas
    5 minutos
  29. 29
    Interfaces: funciones y tipos híbridos
    5 minutos
  30. 30
    ¿Qué diferencia hay entre interfaces y tipos? (2020)
    8 minutos
  31. 31
    Casteos con as
    6 minutos
  32. 32
    instanceof y las guardas
    9 minutos
  33. 33
    Tipos enumerados
    8 minutos
  34. 34
    Valores avanzados para enumerados
    7 minutos
  35. 35
    Enumerados con valores computados
    6 minutos
  36. 36
    Genéricos en tipos
    8 minutos
  37. 37
    Múltiples genéricos y buenas prácticas
    5 minutos
  38. 38
    Genéricos en funciones
    8 minutos
  39. 39
    Genéricos con restricciones
    6 minutos
  40. 40
    Tipos de utilidad
    3 minutos
  41. 41
    Exportando módulos
    9 minutos
  42. 42
    Importando módulos
    7 minutos
  43. 43
    Export default e import asterisco
    6 minutos
  44. 44
    tsconfig
    7 minutos
  45. 45
    Módulos desde NPM
    7 minutos
  46. 46
    Arroba types y los .d.ts
    8 minutos
  47. 47
    Ejemplo (1): creando una API REST simple en TypeScript
    11 minutos
  48. 48
    Ejemplo (2): montando un servidor Express
    8 minutos
  49. 49
    Ejemplo (3): haciendo las funciones de control de datos
    11 minutos
  50. 50
    Ejemplo (4): conectando todas las piezas
    7 minutos