كيفية تشغيل TypeScript من سطر الأوامر: من البسيط إلى الاحترافي
\n\nلقد كتبت أول سكربت لك بلغة TypeScript. يبدو كل شيء جميلاً: كتابة صارمة للأنواع، بناء جملة موجز، إكمال تلقائي في بيئة التطوير المتكاملة (IDE). ولكن عندما تفتح الطرفية (Terminal) وتكتب node script.ts، يعطيك Node.js خطأ. هل هذا مألوف؟
TypeScript هي طبقة إضافية فوق JavaScript، و Node.js لا يعرف كيفية تنفيذ ملفات .ts بشكل مباشر. في هذه المقالة، سنستعرض جميع الطرق الحقيقية لتشغيل TypeScript من سطر الأوامر. ستتعرف على الفرق بين التشغيل السريع وبناء الإنتاج (production build)، ومتى تستخدم ts-node، ومتى تستخدم tsx، وكيف لا تتوه بين الأدوات.
نعتمد على سؤال شائع من Stack Overflow (أكثر من 500 ألف مشاهدة)، لكننا لا نقدم مجرد إجابة، بل مقارنة شاملة بين الطرق. هيا بنا!
\n\nلماذا لا يفهم Node.js لغة TypeScript؟
\n\nقبل أن نركض نحو الأدوات، دعنا نفهم الجوهر. عندما تكتب:
\n\nconst greet = (name: string): string => {\n return `Hello, ${name}!`;\n};\nconsole.log(greet('PythonLib'));\n\nيرى Node.js : string ولا يفهم ماذا يفعل به. JavaScript لا يدعم الكتابة الثابتة للأنواع كجزء من بناء الجملة. لذلك، يجب أولاً تحويل (transpile) TypeScript إلى JavaScript، ثم تشغيله.
هناك طريقتان مختلفتان جوهرياً:
\n- \n
- طريقة من خطوتين: أولاً الترجمة
tsc script.ts، ثم التشغيلnode script.js. \n - طريقة من خطوة واحدة: استخدام أدوات تقوم بكلا الإجراءين نيابة عنك "أثناء التنفيذ" (JIT-compilation). \n
سننظر في كلا الخيارين، لكننا سنبدأ بالأكثر شيوعاً — طريقة الخطوة الواحدة.
\n\nالطريقة 1: ts-node — الكلاسيكية في هذا المجال
\n\nts-node هو محرك تنفيذ TypeScript لـ Node.js. يقوم بترجمة الكود في الذاكرة ويمرره فوراً إلى Node.js. هذه هي أقدم وأثبت طريقة لتشغيل TypeScript من سطر الأوامر دون حركات زائدة.
التثبيت والتشغيل
\n\nnpm install -g ts-node typescript @types/node\nts-node script.ts\n\nهذا كل شيء. سيتم تنفيذ ملفك دون إنشاء ملف JS وسيط. تحت الغطاء، يستخدم ts-node مترجم TypeScript القياسي (tsc)، لكنه يفعل ذلك بشفافية للمطور.
مثال: العمل مع API
\n\n// api-demo.ts\nimport axios from 'axios';\n\ninterface Post {\n userId: number;\n id: number;\n title: string;\n}\n\nasync function fetchFirstPost(): Promise<Post> {\n const response = await axios.get<Post>('https://jsonplaceholder.typicode.com/posts/1');\n return response.data;\n}\n\nfetchFirstPost().then(post => console.log(post.title));\n// الإخراج: sunt aut facere repellat provident occaecati excepturi optio reprehenderit\n\nنقوم بالتشغيل: ts-node api-demo.ts. النتيجة — مباشرة في وحدة التحكم.
إيجابيات وسلبيات ts-node
\n\n- \n
- + البساطة: أمر واحد بدلاً من اثنين. \n
- + دعم
tsconfig.json: جميع إعدادات TypeScript الخاصة بك تؤخذ في الاعتبار. \n - + REPL: الأمر
ts-nodeبدون وسائط يفتح واجهة تفاعلية لـ TypeScript. \n - - السرعة: في كل تشغيل تحدث عملية ترجمة، وهذا ملحوظ في المشاريع الكبيرة. \n
- - استهلاك الذاكرة: عند العمل لفترة طويلة (مثلاً في وضع المراقبة watch-mode)، قد يستهلك ذاكرة الوصول العشوائي (RAM). \n
متى تستخدم: للسكربتات، النماذج الأولية، الأدوات المساعدة الصغيرة. إذا كنت بحاجة لتشغيل ملف TypeScript من سطر الأوامر بسرعة وبدون إعدادات — فإن ts-node هو خيارك.
\n\nالطريقة 2: tsx — الوريث الحديث والسريع
\n\ntsx (TypeScript Execute) هي أداة أحدث،