Export default e import asterisco

Relacionado con el sistema ES Modules, vamos a ver cómo usar dos tipos especiales de import y export. Con export default podemos exportar de manera predominante algún elemento en un módulo, para importarlo sin necesidad de corchetes. Con import asterisco podemos importar de golpe todos los elementos exportados por un módulo.

Cuando organizamos nuestro código en múltiples archivos, es común que cada archivo exporte un único elemento, como una clase o un tipo. Por ejemplo, podríamos tener un archivo producto.ts que exporta el tipo Producto, otro llamado almacen.ts que exporta el tipo Almacen, y otro más, calculadoraDeImpuestos.ts, que exporta la clase CalculadoraDeImpuestos. Sin embargo, cuando queremos importar ese único elemento, la sintaxis habitual con corchetes puede resultar un poco incómoda, ya que estamos usando una estructura pensada para múltiples exportaciones cuando solo necesitamos una.

Aquí es donde entran en juego los export default de ECMAScript moderno. Esta característica nos permite designar un único elemento como la exportación principal de un archivo. Por ejemplo, si en un archivo impuestos.ts queremos exportar solo una función llamada IVA, podemos declararla con export default. Esto significa que cuando importemos desde impuestos.ts, no necesitaremos usar corchetes, sino que podremos importar directamente la función con el nombre que queramos asignarle en el momento de la importación.

Veamos un ejemplo concreto. Supongamos que en impuestos.ts tenemos:

export default function IVA(cantidad: number): number {
  return cantidad * 0.21;
}

Luego, en otro archivo, podemos importar esta función así:

import IVA from './impuestos';

const precioConIVA = IVA(100);
console.log(precioConIVA); // 21

Esta forma simplifica la importación cuando solo hay un elemento relevante en el módulo.

Pero, ¿qué pasa si queremos exportar más cosas además del default? ECMAScript permite combinar un export default con exportaciones normales. Por ejemplo, en impuestos.ts podríamos tener:

export default function IVA(cantidad: number): number {
  return cantidad * 0.21;
}

export type Precio = number;
export type Impuesto = number;

Al importar, podemos traer el default sin corchetes y las otras exportaciones con corchetes:

import IVA, { Precio, Impuesto } from './impuestos';

const precio: Precio = 100;
const impuesto: Impuesto = 21;
const total = IVA(precio);

Es importante recordar que si no usamos corchetes, estamos importando el default. Si usamos corchetes, importamos las exportaciones nombradas.

Por otro lado, cuando tenemos múltiples funciones o elementos exportados sin un default, y queremos importar todo el contenido del módulo sin especificar cada elemento, podemos usar la sintaxis con asterisco. Esto nos permite importar todo como un objeto que contiene todas las exportaciones del módulo.

Por ejemplo, si en impuestos.ts tenemos varias funciones exportadas:

export function IVA(cantidad: number): number {
  return cantidad * 0.21;
}

export function IRPF(cantidad: number): number {
  return cantidad * 0.15;
}

Podemos importar todo así:

import * as impuestos from './impuestos';

const iva = impuestos.IVA(100);
const irpf = impuestos.IRPF(100);

Este objeto impuestos contiene todas las funciones exportadas y nos permite acceder a ellas mediante propiedades. Sin embargo, esta forma solo funciona con elementos que existen en tiempo de ejecución, no con tipos de TypeScript, ya que estos se eliminan tras la compilación.

Hay que tener en cuenta que importar todo un módulo con asterisco puede afectar al tamaño del bundle final en aplicaciones web, ya que se incluyen todas las exportaciones, aunque no se usen todas. Por eso, conviene usar esta técnica con precaución, especialmente en proyectos donde el tamaño y la optimización son importantes.

No obstante, en algunos casos, como al importar librerías de terceros que no se llevan bien con TypeScript, esta sintaxis puede ser útil para evitar problemas y tener acceso a todas las funcionalidades exportadas.

Así, con estas herramientas —export default, combinaciones con exportaciones normales, y la importación con asterisco— podemos manejar de forma flexible y eficiente la modularización de nuestro código en TypeScript y JavaScript moderno.

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