TypeScript 6.0: الإعدادات الجديدة والميزات ودليل الترحيل

TypeScript 6.0 ليس مجرد تحديث عادي — إنه آخر إصدار رئيسي مبني بالكامل على JavaScript قبل الانتقال التاريخي إلى مُترجم Go الأصلي في الإصدار 7.0. أطلقه فريق Microsoft في مارس 2026، وهو يحمل تغييرات جذرية في الإعدادات الافتراضية، ميزات لغوية جديدة، وإيقافات نهائية لخيارات عمّرت سنوات. إذا كنت مطور TypeScript، فهذا الإصدار يتطلب انتباهك الكامل.
إعدادات افتراضية جديدة تغير كل شيء
أكبر تأثير في TypeScript 6.0 لا يأتي من ميزة جديدة، بل من تغيير الإعدادات الافتراضية في tsconfig.json. المشاريع الجديدة ستبدأ بسلوك مختلف تماماً عما اعتاد عليه المطورون.
strict يصبح true افتراضياً
لسنوات، كان الوضع الصارم خياراً يُفعّله المطور يدوياً. الآن أصبح السلوك الافتراضي. هذا يعني أن strictNullChecks و noImplicitAny و strictFunctionTypes وغيرها كلها مُفعّلة تلقائياً:
{
"compilerOptions": {
// لم تعد بحاجة لكتابة هذا — إنه الافتراضي الآن
"strict": true
}
}المشاريع القائمة التي لم تكن تستخدم الوضع الصارم ستواجه عشرات أو مئات الأخطاء الجديدة عند الترقية. الحل هو إضافة "strict": false صراحةً في ملف الإعدادات إلى أن تُصلح الأخطاء تدريجياً.
module يتحول إلى esnext
القيمة الافتراضية لـ module أصبحت "esnext" بدلاً من "commonjs". هذا يعكس الواقع الحالي حيث أصبحت وحدات ESM هي المعيار في بيئات Node.js الحديثة والمتصفحات على حد سواء:
{
"compilerOptions": {
"module": "esnext",
"moduleResolution": "bundler"
}
}target يتحول إلى es2025
لم يعد TypeScript يُترجم إلى ES5 أو ES6 افتراضياً. الهدف الجديد هو "es2025"، مما يعني أن المُخرجات ستحتوي على أحدث بنى JavaScript دون تحويل. هذا يُنتج كوداً أصغر حجماً وأسرع تنفيذاً.
types يتحول إلى مصفوفة فارغة
الإعداد types أصبح [] افتراضياً، أي أن TypeScript لن يُحمّل تلقائياً حزم @types/* من node_modules. عليك تحديد الأنواع التي تحتاجها صراحةً:
{
"compilerOptions": {
"types": ["node", "jest"]
}
}هذا يمنع التلوث غير المقصود لنطاق الأنواع العالمية ويُسرّع عملية التحقق من الأنواع.
rootDir يتحول إلى "."
القيمة الافتراضية لـ rootDir أصبحت "." (المجلد الجذر للمشروع) بدلاً من حسابها تلقائياً من ملفات المصدر. هذا يوفر سلوكاً أكثر قابلية للتنبؤ في المشاريع الأحادية (monorepos) والإعدادات المعقدة.
ميزات اللغة الجديدة
استدلال أقل حساسية للسياق
حسّن TypeScript 6.0 محرك الاستدلال ليكون أذكى في التعامل مع الأنواع المُعقدة. سابقاً كان المُترجم يفشل في استنتاج النوع الصحيح في سياقات معينة، خاصةً مع الدوال المُتداخلة والأنواع الشرطية. الآن يتعامل معها بسلاسة:
// سابقاً: كان يتطلب تحديد النوع يدوياً
// الآن: TypeScript يستنتج النوع تلقائياً
const result = items
.filter((item) => item.active)
.map((item) => item.transform())
.reduce((acc, val) => acc.merge(val));
// النوع مُستنتج بشكل صحيح دون تدخلاستيراد المسارات الفرعية مع #/
يدعم TypeScript 6.0 الآن استيراد المسارات الفرعية (subpath imports) باستخدام البادئة #/ المُعرّفة في package.json. هذا يُلغي الحاجة لمسارات نسبية طويلة:
// package.json
{
"imports": {
"#/utils/*": "./src/utils/*",
"#/components/*": "./src/components/*"
}
}// بدلاً من هذا:
import { formatDate } from "../../../utils/date";
// يمكنك كتابة هذا:
import { formatDate } from "#/utils/date";علم --stableTypeOrdering
يضمن العلم الجديد --stableTypeOrdering أن ترتيب الأنواع المُصدّرة في ملفات .d.ts يبقى ثابتاً بين عمليات البناء المتتالية. هذا حيوي لفرق العمل التي تعتمد على مقارنة ملفات التعريف في مراجعات الكود.
أنواع ES2025 و Temporal API
مع target es2025، يحصل المطورون على أنواع مُدمجة لكل ما أُضيف إلى مواصفات ECMAScript حتى 2025. أبرز إضافة هي Temporal API — البديل الحديث لكائن Date الذي عانى منه المطورون لعقود:
// Temporal API مع أنواع TypeScript كاملة
const now = Temporal.Now.zonedDateTimeISO();
const meeting = Temporal.PlainDateTime.from({
year: 2026,
month: 4,
day: 15,
hour: 14,
minute: 30,
});
// حساب الفرق بين تاريخين بدقة
const duration = now.until(meeting);
console.log(duration.total("hours")); // عدد الساعات المتبقية
// مناطق زمنية بدون مكتبات خارجية
const tunisTime = Temporal.Now.zonedDateTimeISO("Africa/Tunis");
const tokyoTime = tunisTime.withTimeZone("Asia/Tokyo");طرق Map و WeakMap الجديدة: upsert
أُضيفت طريقتان جديدتان لـ Map و WeakMap تُبسّطان نمطاً شائعاً جداً:
const cache = new Map<string, number[]>();
// سابقاً: كنت تكتب هذا النمط المتكرر
if (!cache.has(key)) {
cache.set(key, []);
}
cache.get(key)!.push(value);
// الآن مع getOrInsert:
cache.getOrInsert(key, []).push(value);
// أو مع getOrInsertComputed للقيم المُحسوبة:
const stats = cache.getOrInsertComputed(userId, (id) =>
fetchUserStats(id)
);RegExp.escape
دالة جديدة تُهرّب الأحرف الخاصة في التعبيرات النظامية تلقائياً:
const userInput = "price: $10.00 (USD)";
const escaped = RegExp.escape(userInput);
// النتيجة: "price\\: \\$10\\.00 \\(USD\\)"
const regex = new RegExp(escaped, "g");توحيد مكتبة DOM
وحّد TypeScript 6.0 تعريفات DOM المُتفرقة في مكتبة واحدة متسقة. هذا يُصلح تناقضات كانت موجودة بين lib.dom.d.ts و lib.webworker.d.ts ويُحسّن دقة الأنواع لواجهات برمجة المتصفح الحديثة.
التغييرات العاجلة والإيقافات
TypeScript 6.0 لا يكتفي بالإضافة — بل يحذف ويُوقف عدة خيارات قديمة بحزم.
target es5 مُوقف رسمياً
لم يعد "target": "es5" مدعوماً. المتصفحات والبيئات التي تتطلب ES5 أصبحت هامشية، والحفاظ على تحويلات ES5 كان يُبطئ المُترجم. إذا كنت لا تزال تستهدف ES5، استخدم أداة تحويل خارجية مثل Babel أو esbuild.
--moduleResolution node مُوقف
الخيار "moduleResolution": "node" (المعروف أيضاً بـ "node10") أصبح مُوقفاً. البدائل المدعومة هي:
"node16"— لمشاريع Node.js"nodenext"— لأحدث سلوك Node.js"bundler"— لمشاريع الواجهة الأمامية مع أدوات التجميع
حذف AMD و UMD و SystemJS
أنظمة الوحدات القديمة "module": "amd" و "umd" و "system" حُذفت نهائياً. إذا كان مشروعك يعتمد على إحداها، عليك الترحيل إلى ESM أو CommonJS.
--baseUrl مُوقف
الخيار baseUrl الذي كان يُستخدم لتبسيط مسارات الاستيراد أصبح مُوقفاً لصالح حقل paths مع rootDir أو استيراد المسارات الفرعية بـ #/.
import assertions تُستبدل بـ import attributes
صياغة assert في عبارات الاستيراد حُذفت واستُبدلت بكلمة with التي تتوافق مع مواصفات TC39 النهائية:
// محذوف — لن يعمل في TS 6.0
// import data from "./config.json" assert { type: "json" };
// الصياغة الجديدة المعتمدة
import data from "./config.json" with { type: "json" };--outFile مُوقف
خيار outFile الذي كان يدمج جميع الملفات في ملف واحد أصبح مُوقفاً. أدوات التجميع الحديثة مثل esbuild و Rollup و webpack تقوم بهذه المهمة بشكل أفضل بكثير.
دليل الترحيل: خطوات عملية
الخطوة 1: تحديث TypeScript
npm install typescript@6.0 --save-devالخطوة 2: تشغيل المُترجم ومراجعة الأخطاء
npx tsc --noEmitتوقع أخطاء كثيرة إذا لم تكن تستخدم الوضع الصارم سابقاً. لا تُصب بالذعر — معظمها أخطاء أنواع يمكن إصلاحها تدريجياً.
الخطوة 3: تعطيل الإعدادات الجديدة مؤقتاً
إذا كنت تريد الترقية دون كسر المشروع فوراً، أضف هذه الإعدادات الصريحة للحفاظ على السلوك القديم:
{
"compilerOptions": {
"strict": false,
"module": "commonjs",
"target": "es2020",
"moduleResolution": "node16"
}
}الخطوة 4: الترحيل التدريجي
فعّل الإعدادات الصارمة واحداً تلو الآخر:
{
"compilerOptions": {
"strict": false,
"strictNullChecks": true,
"noImplicitAny": true
// أضف المزيد تدريجياً
}
}الخطوة 5: تحديث الاستيرادات
استبدل assert بـ with في جميع عبارات الاستيراد، وأضف حقل types إذا كنت تعتمد على أنواع @types عالمية.
الخطوة 6: اختبار شامل
npm run build && npm testتأكد من أن جميع الاختبارات تمر وأن سلوك التطبيق في وقت التشغيل لم يتغير.
الطريق إلى TypeScript 7.0: مُترجم Go الأصلي
TypeScript 6.0 هو محطة انتقالية مقصودة. فريق TypeScript بقيادة Anders Hejlsberg يعمل على إعادة كتابة المُترجم بالكامل بلغة Go، وهو ما سيصبح TypeScript 7.0 المُنتظر.
النسخة التجريبية من مُترجم Go حققت بالفعل نتائج مذهلة: سرعة تحقق أسرع بعشر مرات على قواعد كود كبيرة. هذا يعني أن مشروعاً يستغرق 60 ثانية للتحقق من الأنواع قد ينخفض إلى 6 ثوانٍ فقط.
إيقاف الخيارات القديمة في TypeScript 6.0 — مثل AMD و ES5 و outFile — هو تنظيف مُتعمد لتقليل حجم السطح الذي يجب إعادة كتابته في Go. كل خيار يُزال الآن هو عبء أقل على فريق التطوير عند بناء المُترجم الجديد.
ما يُميز نهج فريق TypeScript هو الالتزام بالتوافق. مُترجم Go سيدعم نفس ملفات tsconfig.json ونفس قواعد الأنواع. الهدف هو أن تُبدّل المُترجم دون تغيير سطر واحد في كودك.
خاتمة
TypeScript 6.0 هو إصدار محوري يُجبر النظام البيئي على تبني الممارسات الحديثة: الوضع الصارم افتراضياً، ESM كمعيار، والتخلي عن إرث ES5 و CommonJS القديم. قد يكون الترحيل مؤلماً لبعض المشاريع القديمة، لكنه استثمار ضروري.
الرسالة واضحة: رتّب بيتك الآن. TypeScript 7.0 مع مُترجم Go قادم، وسيكون الانتقال أسهل بكثير إذا كان مشروعك يتبع بالفعل الإعدادات الافتراضية الجديدة لـ TypeScript 6.0.
ابدأ بالترقية في بيئة التطوير، فعّل الإعدادات الصارمة تدريجياً، واستفد من الميزات الجديدة مثل Temporal API واستيراد المسارات الفرعية. مستقبل TypeScript أسرع وأنظف — وهو يبدأ اليوم.
ناقش مشروعك معنا
نحن هنا للمساعدة في احتياجات تطوير الويب الخاصة بك. حدد موعدًا لمناقشة مشروعك وكيف يمكننا مساعدتك.
دعنا نجد أفضل الحلول لاحتياجاتك.