Introdução ao trabalho com sistema de arquivos em TypeScript
Trabalhar com sistema de arquivos é uma das tarefas principais no desenvolvimento de aplicações server-side, utilitários e ferramentas de linha de comando. TypeScript, sendo uma extensão do JavaScript, fornece todos os recursos do Node.js para interagir com arquivos e diretórios, mas adiciona tipagem estrita, tornando o código mais confiável e previsível.
Neste artigo, vamos explorar detalhadamente como trabalhar com sistema de arquivos em TypeScript: desde operações básicas de leitura e escrita até técnicas avançadas, como trabalho com streams e processamento assíncrono. Todos os exemplos são acompanhados de código pronto que você pode usar imediatamente em seus projetos.
Para trabalhar com sistema de arquivos em TypeScript, usamos o módulo nativo fs (file system) do Node.js. Ele fornece métodos síncronos e assíncronos. Em projetos modernos, recomenda-se usar as versões assíncronas com promises (fs.promises) para execução não bloqueante.
1. Configuração do projeto e importação de módulos
Antes de começar, certifique-se de que seu projeto está configurado para funcionar com Node.js e TypeScript. Crie um diretório para o projeto e inicialize-o:
mkdir fs-typescript-tutorialcd fs-typescript-tutorialnpm init -ynpm install typescript @types/node --save-devnpx tsc --initApós a configuração, no arquivo tsconfig.json, verifique se o parâmetro module está definido como commonjs ou ESNext, e target como ES2020 ou superior.
Agora, crie o arquivo index.ts e importe os módulos necessários:
import * as fs from 'fs';import * as path from 'path';
// Ou use a versão com promisesimport { promises as fsPromises } from 'fs';O módulo path também é importante: ele fornece utilitários para trabalhar com caminhos de arquivos, tornando o código multiplataforma (Windows vs Unix).
2. Leitura e escrita de arquivos
2.1 Leitura de arquivo
Vamos considerar as operações básicas com arquivos. Começaremos com a leitura do conteúdo de um arquivo. A abordagem assíncrona usando async/await é a mais moderna e 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('Erro ao ler o arquivo:', error); throw error; }}
// Usoasync function main() { const content = await readFileExample('./example.txt'); console.log('Conteúdo do arquivo:', content);}
main();O método readFile recebe o caminho do arquivo e uma codificação opcional (padrão null — retorna Buffer). Se especificar 'utf-8', retorna uma string.
2.2 Escrita em arquivo
A escrita de dados em um arquivo é feita com writeFile. Se o arquivo não existir, ele será criado. Se existir, será sobrescrito.
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('Arquivo escrito com sucesso'); } catch (error) { console.error('Erro ao escrever o arquivo:', error); throw error; }}
// Adicionar ao final do arquivo (append)async function appendFileExample(filePath: string, data: string): Promise<void> { try { await fs.appendFile(filePath, data + '', 'utf-8'); console.log('Dados adicionados ao final do arquivo'); } catch (error) { console.error('Erro ao adicionar dados:', error); throw error; }}2.3 Trabalhando com arquivos JSON
Frequentemente em aplicações, é necessário salvar e carregar dados no formato JSON. Aqui está um wrapper conveniente: