Introducción al trabajo con el sistema de archivos en TypeScript
Trabajar con el sistema de archivos es una de las tareas clave en el desarrollo de aplicaciones de servidor, utilidades y herramientas de línea de comandos. TypeScript, siendo una extensión de JavaScript, proporciona todas las capacidades de Node.js para interactuar con archivos y directorios, pero añade tipado estricto, lo que hace que el código sea más robusto y predecible.
En este artículo, analizaremos en detalle cómo trabajar con el sistema de archivos en TypeScript: desde operaciones básicas de lectura y escritura hasta técnicas avanzadas, como el trabajo con streams y procesamiento asíncrono. Todos los ejemplos incluyen código listo para usar que puedes implementar directamente en tus proyectos.
Para trabajar con el sistema de archivos en TypeScript se utiliza el módulo incorporado fs (file system) de Node.js. Este proporciona métodos tanto síncronos como asíncronos. En proyectos modernos, se recomienda usar las versiones asíncronas con promesas (fs.promises) para una ejecución no bloqueante.
1. Configuración del proyecto e importación de módulos
Antes de comenzar, asegúrate de que tu proyecto esté configurado para trabajar con Node.js y TypeScript. Crea un directorio para el proyecto e inicialízalo:
mkdir fs-typescript-tutorialcd fs-typescript-tutorialnpm init -ynpm install typescript @types/node --save-devnpx tsc --initDespués de la configuración, en el archivo tsconfig.json asegúrate de que el parámetro module esté establecido en commonjs o ESNext, y target en ES2020 o superior.
Ahora creemos el archivo index.ts e importemos los módulos necesarios:
import * as fs from 'fs';import * as path from 'path';
// O usamos la versión con promisesimport { promises as fsPromises } from 'fs';El módulo path también es importante: proporciona utilidades para trabajar con rutas de archivos, lo que hace que el código sea multiplataforma (Windows vs Unix).
2. Lectura y escritura de archivos
2.1 Lectura de un archivo
Veamos las operaciones básicas con archivos. Comencemos con la lectura del contenido de un archivo. El enfoque asíncrono usando async/await es la forma más moderna y conveniente.
import { promises as fs } from 'fs';
async function readFileExample(filePath: string): Promise<string> { try { const data = await fs.readFile(filePath, 'utf-8'); return data; } catch (error) { console.error('Error al leer el archivo:', error); throw error; }}
// Usoasync function main() { const content = await readFileExample('./example.txt'); console.log('Contenido del archivo:', content);}
main();El método readFile recibe la ruta del archivo y una codificación opcional (por defecto null — devuelve un Buffer). Si se especifica 'utf-8', devuelve una cadena.
2.2 Escritura en un archivo
La escritura de datos en un archivo se realiza con writeFile. Si el archivo no existe, se crea. Si existe, se sobrescribe.
import { promises as fs } from 'fs';
async function writeFileExample(filePath: string, data: string): Promise<void> { try { await fs.writeFile(filePath, data, 'utf-8'); console.log('Archivo escrito exitosamente'); } catch (error) { console.error('Error al escribir el archivo:', error); throw error; }}
// Añadir al final del archivo (append)async function appendFileExample(filePath: string, data: string): Promise<void> { try { await fs.appendFile(filePath, data + '', 'utf-8'); console.log('Datos añadidos al final del archivo'); } catch (error) { console.error('Error al añadir datos:', error); throw error; }}2.3 Trabajo con archivos JSON
A menudo en las aplicaciones es necesario guardar y cargar datos en formato JSON. Aquí tienes un wrapper conveniente: