En TypeScript, los módulos y los espacios de nombres son dos mecanismos que permiten organizar y estructurar el código de manera eficiente. Aunque ambos tienen propósitos similares, se utilizan en contextos diferentes y tienen características distintas.

Módulos

¿Qué es un Módulo?

Un módulo en TypeScript es un archivo que contiene código y exporta uno o más elementos (variables, funciones, clases, interfaces, etc.) que pueden ser importados y utilizados en otros archivos. Los módulos ayudan a dividir el código en partes reutilizables y mantenibles.

Sintaxis de Módulos

Exportación

Para exportar elementos de un módulo, se utiliza la palabra clave export.

// mathUtils.ts
export function add(a: number, b: number): number {
    return a + b;
}

export const PI = 3.14;

Importación

Para importar elementos de un módulo, se utiliza la palabra clave import.

// main.ts
import { add, PI } from './mathUtils';

console.log(add(2, 3)); // 5
console.log(PI); // 3.14

Exportación por Defecto

TypeScript también permite exportar un único valor por defecto desde un módulo.

// logger.ts
export default function log(message: string): void {
    console.log(message);
}
// main.ts
import log from './logger';

log('Hello, TypeScript!'); // Hello, TypeScript!

Reexportación

Es posible reexportar elementos de otros módulos.

// moreMathUtils.ts
export { add, PI } from './mathUtils';

Espacios de Nombres

¿Qué es un Espacio de Nombres?

Un espacio de nombres (namespace) es una forma de agrupar código bajo un nombre común, evitando colisiones de nombres y organizando el código de manera lógica. A diferencia de los módulos, los espacios de nombres no generan archivos separados.

Sintaxis de Espacios de Nombres

Definición

Para definir un espacio de nombres, se utiliza la palabra clave namespace.

namespace Geometry {
    export function areaOfCircle(radius: number): number {
        return Math.PI * radius * radius;
    }

    export function circumferenceOfCircle(radius: number): number {
        return 2 * Math.PI * radius;
    }
}

Uso

Para utilizar elementos de un espacio de nombres, se debe referenciar el nombre del espacio de nombres.

console.log(Geometry.areaOfCircle(5)); // 78.53981633974483
console.log(Geometry.circumferenceOfCircle(5)); // 31.41592653589793

Anidación de Espacios de Nombres

Los espacios de nombres pueden anidarse para organizar mejor el código.

namespace Geometry {
    export namespace Circle {
        export function area(radius: number): number {
            return Math.PI * radius * radius;
        }

        export function circumference(radius: number): number {
            return 2 * Math.PI * radius;
        }
    }
}

console.log(Geometry.Circle.area(5)); // 78.53981633974483
console.log(Geometry.Circle.circumference(5)); // 31.41592653589793

Comparación entre Módulos y Espacios de Nombres

Característica Módulos Espacios de Nombres
Definición Archivos separados Agrupación lógica dentro de un archivo
Importación/Exportación import/export No requiere importación explícita
Uso en JavaScript Compatible con ES6+ No es una característica de ES6+
Ámbito Global (si se importa) Local al archivo

Ejercicio Práctico

Ejercicio

  1. Crea un archivo shapes.ts que contenga un espacio de nombres Shapes con dos funciones: areaOfSquare y perimeterOfSquare.
  2. Exporta estas funciones desde el espacio de nombres.
  3. Crea un archivo main.ts que importe y utilice estas funciones.

Solución

shapes.ts

namespace Shapes {
    export function areaOfSquare(side: number): number {
        return side * side;
    }

    export function perimeterOfSquare(side: number): number {
        return 4 * side;
    }
}

main.ts

/// <reference path="./shapes.ts" />

console.log(Shapes.areaOfSquare(4)); // 16
console.log(Shapes.perimeterOfSquare(4)); // 16

Conclusión

En esta sección, hemos aprendido sobre los módulos y los espacios de nombres en TypeScript. Los módulos son ideales para dividir el código en archivos reutilizables y mantenibles, mientras que los espacios de nombres son útiles para organizar el código dentro de un mismo archivo. Ambos mecanismos son esenciales para escribir código TypeScript limpio y estructurado.

© Copyright 2024. Todos los derechos reservados