Introducción: ¿Por qué es necesario trabajar con el sistema de archivos en TypeScript?
\n\nToda aplicación, tarde o temprano, se enfrenta a la necesidad de interactuar con el sistema de archivos: guardar configuraciones, procesar archivos cargados, llevar registros o gestionar proyectos. TypeScript, como superconjunto de JavaScript, proporciona al desarrollador potentes herramientas para trabajar con archivos y directorios a través del módulo fs (File System) de Node.js.
En este artículo, analizaremos con ejemplos prácticos las operaciones principales con el sistema de archivos en TypeScript: lectura y escritura de archivos, creación y eliminación de directorios, así como el manejo de errores. Todos los ejemplos se presentarán utilizando tipado estricto, que es una ventaja clave de TypeScript.
\n\nMódulos principales para trabajar con el sistema de archivos
\n\nAntes de pasar a la práctica, conozcamos los tres módulos principales que necesitará para trabajar:
\n\n- \n
- fs — módulo principal para operaciones con el sistema de archivos (lectura, escritura, eliminación) \n
- fs/promises — versión del módulo
fscon soporte para promesas (recomendado para código moderno) \n - path — utilidad para trabajar con rutas de archivos y directorios \n
Para importar módulos en TypeScript, use la siguiente sintaxis:
\n\nimport * as fs from 'fs';\nimport * as fsPromises from 'fs/promises';\nimport * as path from 'path';\n\nTenga en cuenta: para un correcto funcionamiento con TypeScript, asegúrese de que en su archivo tsconfig.json estén configuradas las opciones "moduleResolution": "node" y "esModuleInterop": true.
Lectura de archivos: enfoques síncrono y asíncrono
\n\nLectura síncrona con tipado
\n\nLos métodos síncronos bloquean la ejecución del código hasta que se completa la operación. Úselos solo para archivos pequeños o en la carga inicial de la aplicación:
\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nfunction readConfigSync(): Record<string, unknown> {\n const configPath = path.join(__dirname, 'config.json');\n \n try {\n const data = fs.readFileSync(configPath, 'utf-8');\n return JSON.parse(data) as Record<string, unknown>;\n } catch (error) {\n if (error instanceof Error) {\n console.error('Error al leer la configuración:', error.message);\n }\n return {};\n }\n}\n\nconst config = readConfigSync();\nconsole.log('Configuración cargada:', config);\n\nLectura asíncrona con async/await (método recomendado)
\n\nPara código de producción, use siempre métodos asíncronos. TypeScript funciona muy bien con async/await:
\n\nimport { readFile } from 'fs/promises';\nimport * as path from 'path';\n\ninterface UserData {\n id: number;\n name: string;\n email: string;\n}\n\nasync function readUserData(fileName: string): Promise<UserData[]> {\n const filePath = path.resolve('data', fileName);\n \n try {\n const rawData = await readFile(filePath, { encoding: 'utf-8' });\n const users: UserData[] = JSON.parse(rawData);\n return users;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`No se pudo leer el archivo ${fileName}: ${error.message}`);\n }\n throw error;\n }\n}\n\n// Uso\n(async () => {\n try {\n const users = await readUserData('users.json');\n console.log(`Se cargaron ${users.length} usuarios`);\n } catch (error) {\n console.error(error);\n }\n})();\n\nEscritura y actualización de archivos
\n\nCreación y sobrescritura de archivos
\n\nPara escribir datos en un archivo, use el método writeFile. Creará el archivo si no existe, o sobrescribirá el existente:
import { writeFile, mkdir } from 'fs/promises';\nimport * as path from 'path';\n\ninterface LogEntry {\n timestamp: string;\n level: 'info' | 'warn' | 'error';\n message: string;\n}\n\n