Warum die Arbeit mit Dateien in TypeScript nicht beängstigend, sondern praktisch ist
\n\nAls ich anfing, in TypeScript zu schreiben, machte mir der Gedanke Angst: „Und was ist mit Dateien? Im Browser ist alles einfach, aber hier – Server, Festplatten, Pfade...". Aber wie sich herausstellte, ist die Arbeit mit Dateien und dem Dateisystem in TypeScript wie das Zusammenbauen eines LEGO-Sets: Es gibt klare Teile (die Module fs und path), es gibt eine Anleitung (Typisierung), und das Ergebnis ist vorhersehbar. Keine Überraschungen, nur sauberer Code.
In diesem Artikel werden wir uns ansehen, wie man Dateien liest, schreibt, umbenennt und löscht, und dabei modernes TypeScript für Node.js verwendet. Sie erfahren, warum Sie fs/promises anstelle des guten alten fs verwenden sollten, wie Sie sich nicht in Pfaden verlieren und wie Sie Fehler elegant behandeln. Los geht's!
Vorbereitung: Was Sie vor dem Start wissen müssen
\n\nBevor wir in den Code eintauchen, stellen Sie sicher, dass Node.js (Version 14+ – dort gibt es bereits native Promises) installiert ist. Erstellen Sie außerdem ein einfaches Projekt:
\n\nmkdir ts-files-demo\ncd ts-files-demo\nnpm init -y\nnpm install typescript @types/node --save-dev\nnpx tsc --init\n\nAktivieren Sie in der Datei tsconfig.json unbedingt "module": "NodeNext" oder "ESNext" und "target": "ES2022". Jetzt sind Sie bereit für die Arbeit mit dem Dateisystem in TypeScript.
Imports, die Sie immer brauchen werden
\n\nDer korrekteste Weg, Module für die Dateiarbeit heute zu importieren, ist:
\n\nimport { readFile, writeFile, unlink, mkdir, access } from 'fs/promises';\nimport { join, dirname, basename, extname } from 'path';\nimport { fileURLToPath } from 'url';\n\nBeachten Sie: Wir verwenden nicht fs mit Callbacks. Nur fs/promises – das ist der moderne Standard, der hervorragend mit async/await und der Typisierung von TypeScript harmoniert.
Datei lesen: Vom Einfachen zum Sicheren
\n\nBeginnen wir mit dem Klassiker – wir lesen eine Textdatei. Nehmen wir an, wir haben eine data.txt mit einem beliebigen Inhalt.
import { readFile } from 'fs/promises';\n\nasync function readTextFile(filePath: string): Promise<string> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return content;\n } catch (error) {\n console.error('Fehler beim Lesen der Datei:', error);\n throw error;\n }\n}\n\n// Verwendung\nconst data = await readTextFile('./data.txt');\nconsole.log(data);\n\nEinfach, oder? Aber in realen Projekten arbeiten wir oft mit JSON. Lassen Sie uns eine universelle Funktion mit einem Generikum erstellen:
\n\nimport { readFile } from 'fs/promises';\n\nasync function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await readFile(filePath, 'utf-8');\n return JSON.parse(raw) as T;\n}\n\n// Beispiel: Konfiguration lesen\ninterface Config {\n port: number;\n dbUrl: string;\n}\n\nconst config = await readJsonFile<Config>('./config.json');\nconsole.log(config.port); // Typ number – TypeScript sagt es Ihnen selbst\n\nDas ist die Dateiarbeit in TypeScript in ihrer besten Form: Die Typisierung schützt Sie vor dummen Fehlern, und der Code bleibt lesbar.
\n\nIn Datei schreiben: Daten erstellen und aktualisieren
\n\nJetzt lernen wir, Informationen zu speichern. Die Funktion writeFile überschreibt die Datei, falls sie existiert, oder erstellt eine neue.
import { writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\n\nasync function saveToFile(filePath: string, data: string): Promise<void> {\n // Zuerst sicherstellen, dass das Verzeichnis existiert\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n\n // Jetzt schreiben\n await writeFile(filePath, data, 'utf-8');\n console.log(`Datei ${filePath} erfolgreich gespeichert`);\n}\n\n// Objekt als JSON speichern\nconst user = { name: 'Anna', age: 28, role: 'admin' };\n