Aprender TypeScript Namespaces y Módulos

Módulo del curso de TypeScript

TypeScript
TypeScript
Módulo del curso
5 lecciones
6 ejercicios
Actualizado: 30/06/2025

Módulo: Namespaces y Módulos

Este módulo forma parte del curso de TypeScript. Incluye 5 lecciones y 6 ejercicios de programación .

Namespaces y Módulos en TypeScript

La organización del código es fundamental en cualquier aplicación de software profesional. TypeScript ofrece dos mecanismos principales para estructurar y organizar el código: los namespaces y los módulos. Estos sistemas permiten agrupar funcionalidades relacionadas, evitar conflictos de nombres y crear arquitecturas escalables.

Namespaces: Organización Interna

Los namespaces proporcionan una forma de agrupar código relacionado bajo un nombre común, creando un contenedor lógico que evita la contaminación del espacio de nombres global. Esta característica resulta especialmente útil cuando trabajamos con bibliotecas internas o queremos organizar funcionalidades específicas.

namespace Geometria {
    export interface Punto {
        x: number;
        y: number;
    }
    
    export class Rectangulo {
        constructor(
            private ancho: number,
            private alto: number
        ) {}
        
        calcularArea(): number {
            return this.ancho * this.alto;
        }
    }
    
    export function distancia(p1: Punto, p2: Punto): number {
        return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
    }
}

Para utilizar elementos de un namespace, empleamos la notación de punto:

const punto1: Geometria.Punto = { x: 0, y: 0 };
const punto2: Geometria.Punto = { x: 3, y: 4 };

const rectangulo = new Geometria.Rectangulo(10, 5);
const area = rectangulo.calcularArea();
const distanciaEntrePuntos = Geometria.distancia(punto1, punto2);

Los namespaces pueden anidarse para crear jerarquías más complejas:

namespace Aplicacion {
    export namespace Utilidades {
        export function formatearFecha(fecha: Date): string {
            return fecha.toLocaleDateString('es-ES');
        }
        
        export namespace Validacion {
            export function esEmailValido(email: string): boolean {
                return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
            }
        }
    }
}

// Uso de namespaces anidados
const fechaFormateada = Aplicacion.Utilidades.formatearFecha(new Date());
const emailValido = Aplicacion.Utilidades.Validacion.esEmailValido("test@example.com");

Módulos: El Sistema Moderno

Los módulos representan el enfoque moderno y recomendado para organizar código en TypeScript. Cada archivo se considera un módulo independiente con su propio ámbito de variables, evitando conflictos globales y proporcionando un control granular sobre qué elementos se exponen.

Exportación de elementos desde un módulo:

// archivo: matematicas.ts
export interface Operacion {
    ejecutar(a: number, b: number): number;
}

export class Calculadora {
    sumar(a: number, b: number): number {
        return a + b;
    }
    
    multiplicar(a: number, b: number): number {
        return a * b;
    }
}

export const PI = 3.14159;

export function factorial(n: number): number {
    return n <= 1 ? 1 : n * factorial(n - 1);
}

// Exportación por defecto
export default class CalculadoraAvanzada extends Calculadora {
    potencia(base: number, exponente: number): number {
        return Math.pow(base, exponente);
    }
}

Importación de elementos en otro módulo:

// archivo: main.ts
import CalculadoraAvanzada, { Calculadora, PI, factorial } from './matematicas';
import { Operacion } from './matematicas';

const calc = new Calculadora();
const resultado = calc.sumar(5, 3);

const calcAvanzada = new CalculadoraAvanzada();
const potencia = calcAvanzada.potencia(2, 8);

console.log(`El valor de PI es: ${PI}`);
console.log(`Factorial de 5: ${factorial(5)}`);

Patrones de Importación y Exportación

TypeScript ofrece múltiples patrones de importación para diferentes necesidades:

Importación con alias:

import { Calculadora as Calc, PI as ConstantePi } from './matematicas';

const miCalculadora = new Calc();
console.log(`Valor de pi: ${ConstantePi}`);

Importación de todo el módulo:

import * as Mat from './matematicas';

const calc = new Mat.Calculadora();
const resultado = Mat.factorial(6);

Importación dinámica para carga bajo demanda:

async function cargarModulo() {
    const modulo = await import('./matematicas');
    const calc = new modulo.Calculadora();
    return calc.sumar(10, 20);
}

Re-exportación y Módulos Barrel

Los módulos barrel permiten crear puntos de entrada centralizados que simplifican las importaciones:

// archivo: index.ts (barrel module)
export { Calculadora, PI, factorial } from './matematicas';
export { Geometria } from './geometria';
export { Utilidades } from './utilidades';

// Ahora podemos importar desde un solo lugar
import { Calculadora, Geometria, Utilidades } from './mi-biblioteca';

La re-exportación selectiva ofrece control sobre qué elementos exponer:

// Exportar solo elementos específicos
export { Calculadora, PI } from './matematicas';
// No exportamos factorial para mantenerlo interno

Resolución de Módulos

TypeScript utiliza diferentes estrategias de resolución para localizar módulos. La resolución relativa busca archivos en rutas específicas:

// Importaciones relativas
import { MiClase } from './modulos/mi-clase';
import { Utilidad } from '../utilidades/helper';

La resolución no relativa busca en node_modules y rutas configuradas:

// Importaciones de bibliotecas externas
import * as lodash from 'lodash';
import { Component } from '@angular/core';

Los módulos de declaración permiten trabajar con bibliotecas JavaScript existentes:

// archivo: tipos.d.ts
declare module 'mi-biblioteca-js' {
    export function procesarDatos(datos: any[]): string;
    export interface ConfiguracionBiblioteca {
        timeout: number;
        retries: number;
    }
}

Esta organización modular facilita el mantenimiento del código, mejora la reutilización y permite crear aplicaciones escalables con una arquitectura clara y bien estructurada.

Lecciones de este módulo

Explora todas las lecciones disponibles en Namespaces y Módulos

Todos los módulos del curso

Navega entre los módulos de TypeScript

Explora más sobre TypeScript

Descubre más recursos de TypeScript

Alan Sastre - Autor del curso

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, TypeScript es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.