Exportando módulos

Para Node, un módulo es un archivo de código fuente independiente entre sí. Con la palabra clave export, podemos explicarle a Node que un elemento de uno de los archivos, como una función, una clase, o la declaración de un tipo o una interfaz, debería estar disponibles para otros módulos que quieran importarlo y así reutilizar código.

Cuando trabajamos con TypeScript, es habitual comenzar con ejemplos sencillos en un único archivo, especialmente cuando estamos aprendiendo o haciendo pruebas rápidas. Sin embargo, cuando el proyecto crece, como podría ser una aplicación para gestionar un almacén con cientos o miles de productos, mantener todo el código en un solo archivo se vuelve poco práctico y difícil de mantener. Por eso, es fundamental aprender a organizar nuestro código en módulos, que nos permitan dividir la lógica en partes más pequeñas y manejables.

Un módulo es básicamente un archivo que contiene un conjunto de funciones, tipos o clases relacionadas que cumplen una función específica. Por ejemplo, en un sistema de almacén, podríamos tener un módulo que defina el tipo Producto, con propiedades como nombre, descripción, precio, la URL de la imagen y un identificador SKU único. También podríamos tener un tipo Almacén, que represente un índice donde, a partir del SKU, podamos obtener información como el stock actual o la fecha de la última entrega. Además, podríamos incluir funciones auxiliares, como una que calcule la suma total de precios de una lista de productos.

export type Producto = {
  sku: string;
  nombre: string;
  descripcion: string;
  precio: number;
  imagenUrl: string;
};

type Almacen = {
  [sku: string]: {
    stock: number;
    ultimaEntrega: Date;
  };
};

export function sumarTotal(productos: Producto[]): number {
  let total = 0;
  for (const producto of productos) {
    total += producto.precio;
  }
  return total;
}

En este ejemplo, hemos marcado con export el tipo Producto y la función sumarTotal, lo que significa que estos elementos pueden ser utilizados fuera del archivo donde están definidos. En cambio, el tipo Almacen no tiene export, por lo que es privado para ese módulo y no puede ser accedido desde otros archivos. Esto es útil para encapsular detalles internos que no queremos exponer.

Cuando queremos usar estos tipos o funciones en otro archivo, por ejemplo, en un módulo que gestione facturas, nos encontramos con que TypeScript no reconoce automáticamente qué es un Producto, porque está definido en otro archivo. Una solución poco recomendable sería copiar la definición de Producto en el archivo de facturas, pero esto genera duplicación de código y problemas de mantenimiento, ya que cualquier cambio en la definición original tendría que replicarse manualmente en todos los lugares donde se copió.

La forma correcta es importar el tipo Producto desde el módulo donde está definido. Para ello, en el archivo de facturas escribimos:

import { Producto } from './almacen';

function procesarPedido(productos: Producto[]) {
  console.log('Procesando pedido:', productos);
}

Así, indicamos a TypeScript que el tipo Producto que queremos usar proviene del módulo almacen.ts. Esto nos permite reutilizar código y mantener una única fuente de verdad para nuestras definiciones.

Este sistema de exportar e importar módulos está basado en el estándar ESModules de ECMAScript 6, que es compatible con JavaScript desde 2015. TypeScript simplemente transpila estas declaraciones para que funcionen correctamente según la configuración de compilación que tengamos.

Además, esta organización modular nos ayuda a mantener el código limpio y fácil de entender. Podemos tener funciones internas o tipos auxiliares que no exportamos, manteniéndolos privados dentro del módulo, y solo exponemos lo necesario para que otros módulos puedan interactuar con nuestra lógica.

En resumen, dividir nuestro código en módulos con exportaciones e importaciones nos permite construir aplicaciones más grandes y complejas de forma ordenada, facilitando la reutilización y el mantenimiento a largo plazo.

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