لماذا TypeScript هي اللغة المثالية للأتمتة
\nكل مطور قضى ساعات في إعادة تسمية 200 ملف يدويًا، أو جمع بيانات من عشرات الصفحات، أو تحويل JSON إلى التنسيق المطلوب. الروتين يقتل الإنتاجية والدافع. لكن هناك خبر سار: الأتمتة باستخدام TypeScript تحل هذه المشاكل بسرعة وبأناقة.
\nTypeScript ليست مجرد إضافة فوق JavaScript. إنها كتابة صارمة للأنواع، كود قابل للقراءة، ونظام بيئي قوي لـ Node.js. إذا كنت تكتب بلغة Python ولكنك تبحث عن بديل للأتمتة، أو تعمل بالفعل مع TS وتريد استخراج أقصى استفادة منه، فهذه المقالة لك. سنستعرض حالات واقعية: من استخراج صفحات الويب إلى إنشاء أدوات CLI وجداول المهام.
\n\nمن أين تبدأ: إعداد البيئة
\nقبل كتابة نصوص TypeScript، تحتاج إلى تجهيز البيئة. تأكد من تثبيت Node.js (الإصدار 18+) و npm.
\n# تثبيت TypeScript بشكل عام\nnpm install -g typescript\n\n# تهيئة المشروع\nmkdir auto-ts && cd auto-ts\nnpm init -y\nnpm install typescript @types/node ts-node --save-dev\n\nأنشئ ملف tsconfig.json بالإعدادات الأساسية:
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true\n },\n "include": ["src/**/*"]\n}\n\nالآن يمكنك كتابة النصوص في مجلد src وتشغيلها عبر ts-node src/script.ts. هذا هو الأساس لأي أتمتة مهام ts.
حالة 1: استخراج صفحات الويب تلقائيًا
\nتخيل: تحتاج إلى جمع عناوين الأخبار من الصفحة الرئيسية لموقع إخباري. النسخ واللصق اليدوي من الماضي. سنكتب محللًا باستخدام TypeScript مع cheerio و axios.
npm install axios cheerio\n\nلننشئ ملف src/parser.ts:
import axios from 'axios';\nimport * as cheerio from 'cheerio';\n\ninterface NewsItem {\n title: string;\n link: string;\n}\n\nasync function parseNews(url: string): Promise<NewsItem[]> {\n const { data } = await axios.get(url);\n const $ = cheerio.load(data);\n const news: NewsItem[] = [];\n\n $('h2.news-title a').each((i, el) => {\n news.push({\n title: $(el).text().trim(),\n link: $(el).attr('href') || '',\n });\n });\n\n return news;\n}\n\n(async () => {\n const items = await parseNews('https://example-news-site.com');\n console.log(`تم العثور على ${items.length} خبر:`);\n items.forEach(item => console.log(`- ${item.title}`));\n})();\n\nيمكن توسيع استخراج البيانات باستخدام TypeScript بسهولة: إضافة التسجيل إلى CSV، الإرسال إلى Telegram، أو الحفظ في قاعدة بيانات. كتابة الأنواع لـ NewsItem تجعل الكود موثوقًا وواضحًا.
حالة 2: معالجة الملفات بشكل مجمع
\nلنفترض أن لديك مجلدًا يحتوي على مئات ملفات CSV التي تحتاج إلى دمجها في ملف واحد، مع إزالة التكرارات. العمل اليدوي سيستغرق يومًا. الأتمتة باستخدام TypeScript ستنجزها في ثانية.
\nnpm install fs-extra papaparse\n\nimport * as fs from 'fs-extra';\nimport * as path from 'path';\nimport Papa from 'papaparse';\n\ninterface Row {\n [key: string]: string;\n}\n\nasync function mergeCSV(inputDir: string, outputFile: string): Promise<void> {\n const files = (await fs.readdir(inputDir)).filter(f => f.endsWith('.csv'));\n const allRows: Row[] = [];\n const seen = new Set<string>();\n\n for (const file of files) {\n const content = await fs.readFile(path.join(inputDir, file), 'utf-8');\n const parsed = Papa.parse<Row>(content, { header: true });\n \n for (const row of parsed.data) {\n const key = JSON.stringify(row);\n if (!seen.has(key)) {\n seen.add(key);\n allRows.push(row);\n