← TypeScript EspañolChapter 09 of 12

Modulos

## Objetivos de Aprendizaje - Exportar e importar modulos - Usar exportaciones nombradas y por defecto - Trabajar con espacios de nombres - Comprender la resolucion de modulos - Configurar TypeScript para modulos ## Modulos JavaScript ### Sintaxis ES Module ```typescript // math.ts export function add(a: number, b: number): number { return a + b; } export const PI = 3.14159; ``` ```typescript // main.ts import { add, PI } from "./math"; console.log(add(2, 3)); // 5 console.log(PI); // 3.14159 ``` ## Exportaciones Nombradas ### Exportaciones Individuales ```typescript // validators.ts export const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; export function isEmail(value: string): boolean { return emailRegex.test(value); } ``` ### Importacion Especifica ```typescript import { isEmail } from "./validators"; if (isEmail("test@example.com")) { console.log("Email valido"); } ``` ### Renombrar en Export ```typescript export { isEmail as validateEmail }; ``` ### Renombrar en Import ```typescript import { validateEmail as checkEmail } from "./validators"; ``` ## Exportaciones por Defecto ### Declaracion ```typescript // logger.ts export default class Logger { log(message: string): void { console.log(`[LOG] ${message}`); } } ``` ### Import ```typescript import Logger from "./logger"; let logger = new Logger(); logger.log("Hola!"); ``` ### Export por Defecto de Funcion ```typescript // add.ts export default function add(a: number, b: number): number { return a + b; } ``` ```typescript import add from "./add"; console.log(add(2, 3)); // 5 ``` ## Exportaciones de Espacio de Nombres ### Sintaxis export = ```typescript // math.ts export = class Calculator { add(a: number, b: number): number { return a + b; } } ``` ```typescript // main.ts import Calculator = require("./math"); let calc = new Calculator(); calc.add(2, 3); ``` ## Re-exportacion ### Desde Otro Modulo ```typescript // index.ts export { add, subtract } from "./math"; export { isEmail } from "./validators"; ``` ### Todo como Espacio de Nombres ```typescript export * from "./math"; export * from "./validators"; ``` ## Importar Tipos ### Import Solo de Tipo ```typescript import type { User } from "./types"; // User solo se usa como tipo function createUser(data: User): User { return { ...data }; } ``` ### Import de Tipo en Linea ```typescript import { User, type Admin } from "./types"; ``` ## Imports Dinamicos ### Como Funcion ```typescript async function loadModule() { const module = await import("./math"); console.log(module.add(2, 3)); } ``` ### Para Division de Codigo ```typescript async function loadFeature() { if (needsAdvancedFeature()) { const { advancedTool } = await import("./advanced"); advancedTool.run(); } } ``` ## Modulos CommonJS ### Export ```typescript // old-module.js (Estilo CommonJS) module.exports = { add: (a: number, b: number) => a + b }; ``` ### Import CommonJS ```typescript import module = require("./old-module"); console.log(module.add(2, 3)); ``` ## Espacios de Nombres ### Declaracion de Espacio de Nombres ```typescript namespace Validation { export interface StringValidator { isValid(s: string): boolean; } export class EmailValidator implements StringValidator { isValid(s: string): boolean { return s.includes("@"); } } } ``` ### Uso de Espacio de Nombres ```typescript let validator: Validation.StringValidator = new Validation.EmailValidator(); ``` ## Archivos de Espacio de Nombres ### Multiples Archivos ```typescript // validators.ts namespace Validation { export interface StringValidator { isValid(s: string): boolean; } } ``` ```typescript // email-validator.ts /// namespace Validation { export class EmailValidator implements StringValidator { isValid(s: string): boolean { return s.includes("@"); } } } ``` ## Resolucion de Modulos ### relative vs No-relative ```typescript // Imports relative import { User } from "./types"; // ./types.ts import { Logger } from "../utils/logger"; // Imports no-relative import { Component } from "react"; import { from } from "rxjs"; ``` ### Estrategias de Resolucion | Estrategia | Descripcion | |----------|-------------| | node | CommonJS de Node.js | | node16 | Node.js ESM con package.json "type": "module" | | nodenext | Node.js ESM mas reciente | ## Configuracion tsconfig.json ### Configuracion de Modulo ```json { "compilerOptions": { "module": "commonjs", "moduleResolution": "node", "esModuleInterop": true, "forceConsistentCasingInFileNames": true } } ``` ### Interoperabilidad ESM ```json { "compilerOptions": { "esModuleInterop": true } } ``` Esto habilita: - `import React from "react"` funciona incluso si React usa CommonJS - La sintaxis `export =` funciona con imports ES ## Importar JSON ### Con resolveJsonModule ```typescript // tsconfig.json { "compilerOptions": { "resolveJsonModule": true } } ``` ```typescript // data.json { "name": "Alice", "age": 30 } ``` ```typescript import data from "./data.json"; console.log(data.name); // "Alice" ``` ## Modulos Ambientes ### Declaracion de Modulo Ambiente ```typescript // third-party.d.ts declare module "my-library" { export function doSomething(): void; } ``` ### Uso de Modulo Ambiente ```typescript import { doSomething } from "my-library"; doSomething(); ``` ## Exportaciones de Barril ### Re-export con index.ts ```typescript // components/Button/index.ts export { Button } from "./Button"; export { Card } from "./Card"; export { Input } from "./Input"; ``` ```typescript // Uso import { Button, Card } from "./components"; ``` ## Resumen - Modulos ES: `export` e `import` - Exportaciones nombradas: `export const foo = ...` - Exportaciones por defecto: `export default ...` - Imports solo de tipo: `import type { T }` - Re-export: `export { foo } from "./bar"` - Espacio de nombres: `namespace Nombre { ... }` - Usar `tsconfig.json` para configurar modulos - Usar archivos barril (index.ts) para imports limpios

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →