مقدمة: لماذا نحتاج العمل مع نظام الملفات في TypeScript
TypeScript، كونه طبقة علوية صارمة الأنواع فوق JavaScript، يوفر للمطورين أدوات قوية للعمل مع نظام الملفات. بغض النظر عما إذا كنت تنشئ أداة لمعالجة السجلات، أو خادم ويب لتحميل الملفات، أو أداة لترحيل البيانات - فإن القدرة على التفاعل بكفاءة مع نظام الملفات هي مهارة أساسية.
في هذه المقالة، سنستعرض الجوانب العملية للعمل مع نظام الملفات في TypeScript باستخدام الوحدة المدمجة fs (نظام الملفات) من Node.js. جميع الأمثلة ستكون مصحوبة بتعليقات وشروحات مفصلة. سنتناول الطرق المتزامنة وغير المتزامنة، والعمل مع المسارات، وتحديد أنواع البيانات.
1. إعداد المشروع واستيراد وحدة fs
قبل البدء في العمل، من الضروري إعداد مشروع TypeScript. تأكد من تثبيت Node.js ومدير الحزم npm. أنشئ مشروعًا جديدًا وقم بتثبيت الأنواع الخاصة بـ Node.js:
npm init -ynpm install typescript @types/node --save-devnpm install ts-node --save-devأنشئ ملف tsconfig.json وأضف إليه الإعدادات الأساسية:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "strict": true, "esModuleInterop": true, "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*"]}الآن في ملف index.ts الخاص بك، قم باستيراد الوحدات fs و path:
import * as fs from 'fs';import * as path from 'path';هام: في TypeScript نستخدم import * as لاستيراد الوحدة بأكملها. وهذا يضمن تحديد الأنواع الكامل لجميع الطرق.
2. قراءة الملفات: الطرق المتزامنة وغير المتزامنة
2.1 القراءة غير المتزامنة (الطريقة الموصى بها)
في TypeScript، يُفضل استخدام الطرق غير المتزامنة لأنها لا تمنع تدفق التنفيذ الرئيسي. لنلق نظرة على مثال لقراءة ملف نصي:
import * as fs from 'fs/promises';import * as path from 'path';
async function readFileExample(filePath: string): Promise<string> { try { const absolutePath = path.resolve(filePath); const content: string = await fs.readFile(absolutePath, 'utf-8'); return content; } catch (error) { if (error instanceof Error) { throw new Error(`خطأ في قراءة الملف: ${error.message}`); } throw error; }}
// الاستخدام(async () => { const data = await readFileExample('./data/example.txt'); console.log('محتوى الملف:', data);})();لاحظ استخدام fs/promises - وهي نسخة الوحدة مع الوعود (promises) التي تتكامل بشكل ممتاز مع async/await في TypeScript.
2.2 القراءة المتزامنة (للسيناريوهات البسيطة)
أحيانًا، على سبيل المثال عند تحميل الإعدادات عند بدء التشغيل، يمكن استخدام الطرق المتزامنة:
import * as fs from 'fs';import * as path from 'path';
function readConfigSync(configPath: string): Record<string, unknown> { const fullPath = path.join(__dirname, configPath); const rawData = fs.readFileSync(fullPath, 'utf-8'); return JSON.parse(rawData);}
const config = readConfigSync('./config.json');console.log('الإعدادات:', config);3. كتابة وتعديل الملفات
3.1 كتابة البيانات إلى ملف
لكتابة البيانات إلى ملف، استخدم writeFile. يتيح لك TypeScript تحديد أنواع البيانات بدقة قبل الكتابة:
import * as fs from 'fs/promises';
interface UserData { id: number; name: string; email: string;}
async function saveUserData(users: UserData[]): Promise<void> { const jsonString: string = JSON.stringify(users, null, 2); await fs.writeFile('./users.json', jsonString, 'utf-8'); con