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 →