Trabajo con el sistema de archivos en TypeScript: guía práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué es necesario trabajar con el sistema de archivos en TypeScript?

\n\n

Toda 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.

\n\n

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\n

Módulos principales para trabajar con el sistema de archivos

\n\n

Antes 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 fs con soporte para promesas (recomendado para código moderno)
  • \n
  • path — utilidad para trabajar con rutas de archivos y directorios
  • \n
\n\n

Para importar módulos en TypeScript, use la siguiente sintaxis:

\n\n
import * as fs from 'fs';\nimport * as fsPromises from 'fs/promises';\nimport * as path from 'path';
\n\n

Tenga 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.

\n\n

Lectura de archivos: enfoques síncrono y asíncrono

\n\n

Lectura síncrona con tipado

\n\n

Los 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\n
import * 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\n

Lectura asíncrona con async/await (método recomendado)

\n\n

Para código de producción, use siempre métodos asíncronos. TypeScript funciona muy bien con async/await:

\n\n
import { 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\n

Escritura y actualización de archivos

\n\n

Creación y sobrescritura de archivos

\n\n

Para escribir datos en un archivo, use el método writeFile. Creará el archivo si no existe, o sobrescribirá el existente:

\n\n
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                

Blogs

Book Recommendations