TypeScript 7 بمترجم Go: أسرع عشرة أضعاف، لكن هل يمكنك الترقية اليوم؟
مترجم TypeScript الجديد بلغة Go يختصر البناء من دقيقتين إلى ثوانٍ، لكن غياب الواجهة البرمجية يمنع Vue وESLint. دليل الترقية العملي على مراحل.

في يوليو 2026 أطلقت مايكروسوفت الإصدار السابع من TypeScript، وكان العنوان الذي تصدّر كل التغطيات رقمًا واحدًا: أسرع بعشرة أضعاف. لكن خلف هذا الرقم قصة أكثر تعقيدًا، لأن هذه المرة لم تُضِف اللغة صيغًا جديدة ولا أنواعًا ذكية، بل غيّرت المحرّك نفسه بالكامل. المترجم الذي كان مكتوبًا بـ TypeScript ويعمل فوق JavaScript صار الآن برنامجًا أصليًا مكتوبًا بلغة Go. والنتيجة مكسب في السرعة يصعب تجاهله، يقابله قيد واحد يجعل نصف المشاريع الحقيقية غير قادرة على الترقية اليوم. هذا المقال يشرح ما تغيّر، وكيف تعرف إن كان مشروعك جاهزًا أم لا، وما هي الخطة العملية للانتقال على مراحل.
ما الذي تغيّر فعليًا في TypeScript 7؟

منذ نشأتها كُتبت أدوات TypeScript بلغة TypeScript نفسها، ثم تُترجم إلى JavaScript وتعمل داخل Node.js. هذا خيار أنيق من ناحية المجتمع والمساهمات، لكنه يفرض سقفًا صلبًا على الأداء: عملية أحادية الخيط، وجامع قمامة لا يتحكم فيه المترجم، وذاكرة تُدار بطريقة غير مناسبة لبنية بيانات ضخمة مثل شجرة الأنواع في مشروع فيه مئات الآلاف من الأسطر.
نقل لا إعادة كتابة
النقطة الأهم التي أكّدها فريق TypeScript مرارًا: ما جرى هو نقل (Port) وليس إعادة كتابة (Rewrite). الكود الجديد بلغة Go يحاكي بنية الكود القديم سطرًا بسطر تقريبًا، بنفس الخوارزميات ونفس ترتيب العمليات. الهدف من هذا القرار عملي بحت: ضمان أن دلالات فحص الأنواع تبقى متطابقة، بحيث لا يظهر خطأ جديد ولا يختفي خطأ قديم لمجرد أنك بدّلت المترجم.
لماذا Go تحديدًا وليس Rust أو C++؟ لأن Go تقدّم مزيجًا مناسبًا للحالة: تعامل طبيعي مع الذاكرة المشتركة بين الخيوط، وجامع قمامة يشبه في سلوكه ما اعتاد عليه الكود الأصلي، وبنية لغوية قريبة بما يكفي من الكود القديم لجعل النقل الآلي شبه ممكن. المشروع بدأ تحت الاسم الحركي Corsa، بينما صار الكود القديم يُشار إليه باسم Strada.
أرقام الأداء: ماذا تعني «عشرة أضعاف» عمليًا؟
الأرقام المنشورة ليست تسويقية بقدر ما هي قابلة للتحقق، لأن معظمها على مشاريع مفتوحة المصدر يستطيع أي أحد إعادة قياسها:
| القياس | TypeScript 6 | TypeScript 7 | الفارق |
|---|---|---|---|
| بناء كامل لمشروع VS Code | 125.7 ثانية | 10.6 ثانية | 11.9× |
| زمن تحميل المشروع في المحرر | 9.6 ثانية | 1.2 ثانية | 8× |
| استهلاك الذاكرة الإجمالي | الأساس | أقل بنحو 18% | — |
| فحص الأنواع في CI لدى فريق Slack | نحو 7.5 دقيقة | نحو 1.25 دقيقة | 6× |
الفارق الذي يشعر به المطوّر يوميًا ليس زمن البناء في خط الإنتاج، بل الرقم الثاني في الجدول: الوقت الذي يقضيه المحرر وهو «يفكّر» قبل أن يبدأ الإكمال التلقائي والانتقال إلى التعريف في العمل. في مشروع كبير، انتظار عشر ثوانٍ في كل مرة تفتح فيها المحرر هو ضريبة تُدفع عشرات المرات في اليوم.
المكسب الحقيقي في المترجم الأصلي ليس أنه ينهي البناء أسرع، بل أنه يحوّل فحص الأنواع من خطوة تنتظرها إلى ردّ فعل فوري أثناء الكتابة.
يتحكم المترجم الجديد في التوازي عبر خيارين جديدين: --checkers لعدد وحدات الفحص المتوازية، و--builders لعمليات البناء، مع إمكانية إيقاف التوازي كليًا بـ --singleThreaded في البيئات المحدودة الموارد مثل حاويات CI الصغيرة.
العقبة الحقيقية: غياب الواجهة البرمجية المستقرة
هنا تنقلب الصورة. الإصدار 7.0 يوفّر أداة سطر الأوامر tsc فقط، ولا يوفّر واجهة برمجية مستقرة (Programmatic API) يستطيع مطوّرو الأدوات استيرادها. وهذه الواجهة تحديدًا هي ما تبني عليه منظومة كاملة من الأدوات.
من يتأثر؟
- typescript-eslint: أي قاعدة تحتاج معلومات الأنواع تستورد
typescriptكمكتبة. طلب دعم الإصدار السابع فُتح يوم الإطلاق وأُغلق بوصف «غير مخطط له»، لأن الحل ليس عند اللينتر بل عند TypeScript نفسه. - Vue وSvelte وAstro وMDX: هذه الأطر تفحص الأنواع داخل القوالب والمكوّنات أحادية الملف عبر طبقة Volar التي تضمّن المترجم القديم داخلها.
- Angular: فحص أنواع القوالب لديه مبني على الآلية نفسها ولا يستطيع الانتقال بعد.
- ts-jest وts-morph وأدوات توليد الكود: كلها تستورد المترجم برمجيًا.
النتيجة العملية أنك إن حاولت التثبيت فوق مشروع فيه typescript-eslint فستصطدم بخطأ ERESOLVE من npm لأن نطاق الاعتماد النظير لا يتجاوز 6.1، وإن أجبرت التثبيت بالتجاوز فإن الفشل ينتقل ببساطة من زمن التثبيت إلى زمن التشغيل.
الحل المؤقت الرسمي هو حزمة @typescript/typescript6 التي تثبّت المترجم القديم جنبًا إلى جنب بأمر باسم tsc6، فتستطيع تشغيل الاثنين في المشروع نفسه دون تعارض في الأسماء. والتوصية المعلنة من الفريق: استخدم المترجم الجديد للفحص السريع للمشروع كله من سطر الأوامر، وأبقِ القديم لخدمة المحرر والقوالب. أما الواجهة الجديدة فمتوقعة مع الإصدار 7.1، وحتى كتابة هذه السطور لم تُعلن مايكروسوفت تاريخًا نهائيًا له.
تغييرات في الإعدادات الافتراضية قد تفاجئك
بعيدًا عن الأداء، غيّر الإصدار السابع عددًا من القيم الافتراضية في tsconfig.json، وهذه التغييرات قادرة على إظهار عشرات الأخطاء في مشروع كان «نظيفًا» بالأمس:
strictمفعّل افتراضيًا: المشاريع التي كانت تعتمد على الوضع المتساهل ستحتاج إمّا إلى إصلاح الأخطاء وإمّا إلى تعطيله صراحةً.moduleصارesnextافتراضيًا: قد يغيّر طريقة حلّ الاستيرادات في مشاريع لم تحدّد القيمة بنفسها.stableTypeOrderingمفعّل ولا يمكن تعطيله: يجعل ترتيب الأنواع في الرسائل وفي الإخراج ثابتًا ومتوقعًا، وهو مفيد للمقارنات الآلية لكنه قد يغيّر نصوص أخطاء تعتمد عليها اختباراتك.- قيم افتراضية جديدة لـ
rootDirوtypes: تستحق مراجعة سريعة قبل أول بناء.
النصيحة هنا بسيطة: قبل الترقية، اكتب في ملف الإعدادات صراحةً كل خيار كنت تعتمد فيه على القيمة الافتراضية. هذا يحوّل الترقية من مفاجأة إلى قرار واعٍ لكل خيار على حدة.
خطة ترقية على مراحل
الطريقة الأقل ألمًا لا تبدأ بتبديل المترجم في كل مكان دفعة واحدة، بل بتقسيم الاستخدام:
المرحلة الأولى — تشخيص. افحص ملف package.json وابحث عن أي حزمة تستورد typescript كاعتماد نظير. إن لم تجد شيئًا سوى tsc في سكربتات البناء، فأنت من الحالات السعيدة ويمكنك الترقية اليوم.
المرحلة الثانية — المترجم الجديد في CI فقط. أضف خطوة فحص أنواع سريعة بالمترجم الأصلي في خط التكامل، مع إبقاء كل شيء آخر على الإصدار السادس. هذه الخطوة وحدها تختصر دقائق من كل عملية دمج دون أن تمسّ بيئة المطوّر.
المرحلة الثالثة — تثبيت متوازٍ محليًا. ثبّت حزمة التوافق واجعل المحرر والقوالب واللينتر يعملون على tsc6، بينما يستخدم المطوّر الأمر الجديد لفحص المشروع كله عند الحاجة.
المرحلة الرابعة — الانتقال الكامل. انتظر 7.1 والواجهة البرمجية الجديدة، ثم راقب إصدارات typescript-eslint وVolar التي تعلن دعمها. لا تجبر شيئًا قبل ذلك.
أسئلة شائعة
هل يعني هذا أن TypeScript صارت لغة مكتوبة بـ Go؟
لا. اللغة نفسها لم تتغيّر، وقواعدها وأنواعها كما هي. ما تغيّر هو الأداة التي تفحص الكود وتترجمه، وصارت برنامجًا أصليًا مكتوبًا بـ Go بدل برنامج يعمل داخل Node.js. الكود الذي تكتبه أنت ما زال TypeScript يُترجَم إلى JavaScript تمامًا كما كان.
هل سأحصل على أخطاء أنواع مختلفة بعد الترقية؟
الدلالات مُصمَّمة لتكون متطابقة لأن العملية كانت نقلًا لا إعادة كتابة، فلا يُفترض أن يظهر خطأ جديد بسبب المترجم ذاته. لكن الأخطاء الجديدة ستظهر فعلًا إن كنت تعتمد على الإعدادات الافتراضية القديمة، وخصوصًا تفعيل strict تلقائيًا. الفارق مصدره الإعدادات لا المحرّك.
مشروعي يستخدم Vue أو Angular، ماذا أفعل الآن؟
ابقَ على الإصدار السادس لبيئة التطوير والقوالب، واستفد من المترجم الجديد في خطوة فحص منفصلة في CI عبر حزمة التوافق. القرار ليس بيدك ولا بيد الإطار الذي تستخدمه، بل ينتظر الواجهة البرمجية القادمة، ومحاولة الالتفاف عليها بالتثبيت القسري تنتج أعطالًا في وقت التشغيل يصعب تشخيصها.
الخلاصة
الإصدار السابع من TypeScript حالة نادرة في عالم الأدوات: مكسب أداء بحجم يغيّر طريقة العمل اليومية، بلا أي تغيير في اللغة يجبرك على إعادة كتابة سطر واحد. لكنه وصل ناقصًا قطعة واحدة — الواجهة البرمجية — وهذه القطعة بالذات هي ما تقف عليه منظومة الأدوات كاملة من اللينتر إلى دعم القوالب.
القاعدة العملية واضحة: إن كان كل ما تفعله هو تشغيل tsc، رقِّ اليوم واستمتع بالفارق. وإن كان أي شيء في مشروعك يستورد المترجم كمكتبة، فخطتك هي الاستفادة الجزئية عبر التثبيت المتوازي، والانتظار حتى يصل الإصدار 7.1. وفي الحالتين، اكتب إعداداتك صراحةً قبل الترقية — فأغلب «مفاجآت» هذا الإصدار لم تأتِ من Go، بل من قيم افتراضية تغيّرت بهدوء.