Introducción al trabajo con el sistema de archivos en TypeScript
TypeScript es una extensión fuertemente tipada de JavaScript que añade tipado estático y mejora la legibilidad y mantenibilidad del código. Una de las tareas clave en el desarrollo de aplicaciones del lado del servidor es trabajar con el sistema de archivos: lectura y escritura de archivos, creación y eliminación de directorios, gestión de flujos de datos. En este artículo analizaremos en detalle cómo trabajar eficientemente con el sistema de archivos en TypeScript utilizando el módulo incorporado fs de Node.js.
El módulo fs proporciona métodos tanto síncronos como asíncronos para interactuar con el sistema de archivos. En TypeScript podemos aprovechar las ventajas del tipado para hacer el código más robusto y comprensible. Revisaremos las operaciones principales, incluyendo lectura, escritura, verificación de existencia de archivos, trabajo con directorios y manejo de errores.
Operaciones básicas con archivos
Lectura de archivos
Para leer el contenido de un archivo en TypeScript se puede usar el método readFile (asíncrono) o readFileSync (síncrono). El enfoque asíncrono se recomienda para una ejecución no bloqueante del programa.
import { readFile } from 'fs/promises';
async function readFileExample(filePath: string): Promise<string> { try { const data = await readFile(filePath, 'utf-8'); return data; } catch (error) { console.error('Error al leer el archivo:', error); throw error; }}
// UsoreadFileExample('example.txt').then(content => { console.log('Contenido del archivo:', content);});Observe el uso de fs/promises — es un envoltorio de promesas que permite usar la sintaxis async/await. El tipo de retorno Promise<string> indica explícitamente que la función devuelve una cadena.
Escritura en archivos
La escritura de datos en un archivo se realiza con los métodos writeFile y writeFileSync. En TypeScript es importante manejar correctamente los posibles errores, especialmente si el archivo está protegido contra escritura o la ruta no existe.
import { writeFile, mkdir } from 'fs/promises';import { existsSync } from 'fs';
async function writeFileExample(filePath: string, data: string): Promise<void> { try { // Verificamos si existe el directorio const dir = filePath.substring(0, filePath.lastIndexOf('/')); if (dir && !existsSync(dir)) { await mkdir(dir, { recursive: true }); } await writeFile(filePath, data, 'utf-8'); console.log('Archivo escrito exitosamente'); } catch (error) { console.error('Error al escribir el archivo:', error); }}
// UsowriteFileExample('data/output.txt', 'Hello, TypeScript!');En este ejemplo primero verificamos la existencia del directorio y lo creamos si es necesario usando mkdir con la opción recursive: true. Esto permite evitar el error "ENOENT" si la carpeta padre no existe.
Añadir datos al final de un archivo
Si necesita agregar datos a un archivo existente, use el método appendFile:
import { appendFile } from 'fs/promises';
async function appendToFile(filePath: string, data: string): Promise<void> { try { await appendFile(filePath, '' + data, 'utf-8'); console.log('Datos agregados'); } catch (error) { console.error('Error al agregar:', error); }}Trabajo con directorios
Creación y eliminación de directorios
Para crear directorios se usa mkdir, para eliminar — rmdir o rm (para eliminación recursiva). En TypeScript es conveniente usar genéricos para tipificar las rutas.
import { mkdir, rmdir, rm } from 'fs/promises';import { existsSync } from 'fs';
async function createDirectory(di