صدر TypeScript 6.0 في 20 مارس 2026، وهو أبرز إصدار في تاريخ اللغة منذ سنوات طويلة. ليس بسبب مشغّل أنواع جديد أو ميزة صغيرة — بل لأنه آخر إصدار من مترجم TypeScript مكتوب بلغة JavaScript. سيحمل TypeScript 7 مترجماً مبنياً بلغة Go يَعِد ببناء أسرع بعشرة أضعاف. جاء TypeScript 6.0 ليكون الجسر: يُعزّز الإعدادات الافتراضية، ويتخلص من الميراث القديم، ويُضيف مميزات حقيقية كدعم Temporal API مدمج.
إذا أجريت الترقية دون قراءة ملاحظات الإصدار، سينكسر بناؤك. هذا الدليل يأخذك خطوة بخطوة عبر كل ما تغيّر، مع أمثلة عملية وقائمة مراجعة هجرة مفصّلة.
المتطلبات المسبقة
قبل البدء، تأكد من توفّر ما يلي:
- Node.js 18 أو أحدث
- مشروع TypeScript يعمل حالياً على الإصدار 5.x
- معرفة أساسية بملف
tsconfig.json - محرر أكواد (يُنصح بـ VS Code)
ما ستتعلمه
بنهاية هذا الدليل ستكون قد:
- هاجرت ملف
tsconfig.jsonبالكامل ليتوافق مع TypeScript 6.0 - طبّقت أمثلة عملية على كل ميزة جديدة جوهرية
- فهمت أنواع Temporal API المدمجة وكيفية استخدامها
- استوعبت ما يعنيه TypeScript 7 بمترجمه المبني على Go لسير عملك
الخطوة 1: تثبيت TypeScript 6.0
ابدأ بترقية مشروعك:
npm install typescript@6 --save-dev
# أو
pnpm add typescript@6 --save-devبعد التثبيت، شغّل المترجم فوراً لترى ما سيكسر:
npx tsc --noEmit 2>&1 | head -50على الأرجح ستظهر أخطاء تتعلق بخيارات إعداد متقادمة أو انتهاكات وضع strict. لا تقلق — كل خطأ يُعالَج في قسم من هذا الدليل.
الخطوة 2: فهم الإعدادات الافتراضية الجديدة
غيّر TypeScript 6.0 تسعة إعدادات افتراضية في tsconfig.json. إذا اعتمد مشروعك على قيم افتراضية ضمنية، سيتغير سلوك البناء دون تحذير. إليك مقارنة شاملة:
| الخيار | الإعداد في 5.x | الإعداد في 6.0 |
|---|---|---|
strict | false | true |
module | commonjs | esnext |
target | es3 | es2025 |
moduleResolution | node | bundler |
esModuleInterop | false | true |
types | جميع المرئية | [] (فارغة) |
rootDir | مستنتجة | مجلد tsconfig |
الإجراء: اجعل جميع الإعدادات الافتراضية صريحة
أكثر نهج آمن للهجرة هو تثبيت كل إعداد افتراضي صراحةً في tsconfig.json، حتى لا تتغير القيم الافتراضية صامتةً مع ترقيات TypeScript المستقبلية:
{
"compilerOptions": {
"target": "es2022",
"module": "esnext",
"moduleResolution": "bundler",
"strict": true,
"esModuleInterop": true,
"types": [],
"rootDir": "./src",
"outDir": "./dist"
}
}إذا احتجت الاحتفاظ بالسلوك القديم خلال الهجرة التدريجية، أضف:
{
"compilerOptions": {
"ignoreDeprecations": "6.0"
}
}هذا يُخفت تحذيرات الإيقاف مؤقتاً. لن يعمل في TypeScript 7.0، فعامله كعكاز مؤقت لا كحل دائم.
الخطوة 3: التعامل مع التغييرات الجوهرية
3.1 — وضع Strict مُفعَّل افتراضياً الآن
strict: true يُفعّل مجموعة من علامات الصرامة:
strictNullChecksstrictFunctionTypesstrictBindCallApplystrictPropertyInitializationnoImplicitAnynoImplicitThisuseUnknownInCatchVariables
إذا لم يكن مشروعك يملك strict: true من قبل، ستظهر أخطاء مثل:
// خطأ في 6.0: الكائن قد يكون 'undefined'
function greet(name: string | undefined) {
return "مرحبا " + name.toUpperCase(); // ❌
}
// الحل: أضف فحص null
function greet(name: string | undefined) {
return "مرحبا " + (name ?? "زائر").toUpperCase(); // ✅
}لمشاريع كبيرة، فعّل علامات strict بشكل فردي وعالجها تباعاً:
{
"compilerOptions": {
"strict": false,
"strictNullChecks": true,
"noImplicitAny": true
}
}3.2 — إزالة الهدف ES5
إذا كان لديك "target": "es5" في إعداداتك، سيعطي TypeScript 6.0 خطأ. حدّث الهدف:
{
"compilerOptions": {
"target": "es2022"
}
}إذا كنت تحتاج فعلاً إلى ناتج ES5 لدعم متصفحات قديمة، استخدم Babel أو SWC كخطوة transpilation بعد TypeScript.
3.3 — صيغتا AMD وUMD متقادمتان
// ❌ متقادم في 6.0
{
"compilerOptions": {
"module": "amd"
}
}
// ✅ استخدم بدلاً من ذلك
{
"compilerOptions": {
"module": "esnext"
}
}3.4 — إزالة خيار outFile
كان outFile يدمج كل المخرجات في ملف واحد — نمط قديم من حقبة ما قبل bundlers. أُزيل كلياً. استبدله بـ Vite أو Rollup أو tsdown أو esbuild.
3.5 — baseUrl المستقل متقادم
baseUrl بدون paths متقادم. استخدم التعيينات الصريحة:
// ❌ متقادم
{
"compilerOptions": {
"baseUrl": "./src"
}
}
// ✅ استخدم paths بدلاً من ذلك
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}الخطوة 4: استخدام أداة الهجرة الآلية
للتغييرين الأكثر إرباكاً (إزالة baseUrl والاستنتاج الجديد لـ rootDir)، استخدم أداة ts5to6 الرسمية:
npx ts5to6تفحص هذه الأداة tsconfig.json وتقوم تلقائياً بـ:
- تحويل
baseUrlالمستقل إلىpathsصريحة - إضافة
rootDirالصريح حيث كان مستنتجاً سابقاً - تحديد الخيارات التي تحتاج مراجعة يدوية
شغّلها أولاً، ثم عالج الأخطاء المتبقية يدوياً.
الخطوة 5: استكشاف المميزات الجديدة للغة
5.1 — أنواع Temporal API المدمجة
وصل اقتراح Temporal API إلى المرحلة 4، وأدرج TypeScript 6.0 تعريفات الأنواع له مدمجةً. لا حاجة لـ polyfill أو حزمة @types.
فعّلها في إعداداتك:
{
"compilerOptions": {
"target": "esnext",
"lib": ["esnext", "esnext.temporal", "dom"]
}
}ثم استخدمها مع أمان أنواع كامل:
// الحصول على التاريخ والوقت الحاليين
const now = Temporal.Now.plainDateTimeISO();
console.log(now.toString()); // "2026-06-03T12:00:00"
// إضافة مدة زمنية
const nextWeek = now.add({ days: 7 });
console.log(nextWeek.toString()); // "2026-06-10T12:00:00"
// حساب الفرق بين تاريخين
const deadline = Temporal.PlainDateTime.from("2026-12-31T23:59:00");
const diff = now.until(deadline);
console.log(`${diff.days} يوماً حتى نهاية العام`);
// مع دعم المناطق الزمنية
const meetingInRiyadh = Temporal.ZonedDateTime.from({
timeZone: "Asia/Riyadh",
year: 2026,
month: 6,
day: 15,
hour: 14,
minute: 30,
});
console.log(meetingInRiyadh.toString());فئات Temporal الرئيسية وأنواعها:
| الفئة | الوصف | نوع TypeScript |
|---|---|---|
Temporal.PlainDate | تاريخ تقويمي بدون وقت | Temporal.PlainDate |
Temporal.PlainTime | وقت بدون تاريخ | Temporal.PlainTime |
Temporal.PlainDateTime | تاريخ ووقت بدون منطقة زمنية | Temporal.PlainDateTime |
Temporal.ZonedDateTime | تاريخ ووقت ومنطقة زمنية | Temporal.ZonedDateTime |
Temporal.Instant | لحظة UTC مطلقة | Temporal.Instant |
Temporal.Duration | مدة زمنية | Temporal.Duration |
تنبيه: إذا كان مشروعك يستخدم
temporal-polyfillأو@js-temporal/polyfill، فأنواع تلك الحزم غير متوافقة مع الأنواع المدمجة الجديدة. أزل الـ polyfill حين يدعم بيئة التشغيل لديك Temporal بشكل أصلي (Node.js 22 وما فوق).
5.2 — استنتاج أنواع الدوال المحسّن
يُصلح TypeScript 6.0 قيوداً قديمة تتعلق بعدم دقة استنتاج أنواع التوابع في الأنواع العامة:
class QueryBuilder<T> {
filter(predicate: (item: T) => boolean): this {
return this;
}
sort(comparator: (a: T, b: T) => number): this {
return this;
}
}
// يستنتج TypeScript 6.0 الآن بشكل صحيح سلسلة الأنواع
const result = new QueryBuilder<User>()
.filter(u => u.active) // يُستنتج بشكل صحيح كـ QueryBuilder<User>
.sort((a, b) => a.age - b.age); // لا يزال QueryBuilder<User>5.3 — استيرادات المسار الفرعي بادئة #/
يُضيف TypeScript 6.0 دعماً من الدرجة الأولى لاستيرادات المسار الفرعي في Node.js. عرّفها في package.json:
{
"imports": {
"#/utils": "./src/utils/index.ts",
"#/config": "./src/config.ts",
"#/*": "./src/*.ts"
}
}ثم استخدمها في TypeScript مع حل الأنواع الكامل:
import { formatDate } from "#/utils";
import { appConfig } from "#/config";يحل TypeScript 6.0 هذه الاستيرادات إلى الملفات المصدر الصحيحة دون أي إعداد إضافي.
5.4 — الهدف والمكتبة ES2025
يُصدر الهدف الجديد "target": "es2025" مميزات JavaScript الحديثة بشكل أصلي:
// مع target: "es2025"، لن يُحوّل TypeScript هذه العبارات
const result = await Promise.try(() => riskyOperation());
import data from "./data.json" with { type: "json" };
const escaped = RegExp.escape("hello.world"); // "hello\\.world"الخطوة 6: تحسينات الأداء في الواقع العملي
يُقدّم TypeScript 6.0 تحسينات أداء ملموسة:
- أسرع بنسبة 40-60% في التجميع التدريجي — يخزّن المترجم نتائج حل الأنواع بشكل أكثر عدوانية
- انخفاض 25% في استهلاك الذاكرة — تراجع ملحوظ في ذروة استهلاك الذاكرة للمشاريع الكبيرة
- أسرع بنسبة 30% في عمليات المحرر — تلميحات الأنواع والتنقل بين التعريفات أسرع وأكثر استجابة
لا تحتاج تغيير أي كود للاستفادة من هذه التحسينات. تُطبَّق تلقائياً بعد الترقية.
لقياس أوقات البناء:
# قبل الترقية
time npx tsc --noEmit
# بعد الترقية إلى 6.0
time npx tsc --noEmitالخطوة 7: التحقق من الهجرة
بعد تطبيق جميع التغييرات، شغّل فحص الأنواع الكامل:
npx tsc --noEmitتحقق كذلك من اجتياز الاختبارات:
npm testهجرة ناجحة تعني:
- لا أخطاء TypeScript على
tsc --noEmit - جميع الاختبارات تمر بنجاح
- مخرجات البناء بالصيغة الصحيحة
الخطوة 8: الاستعداد لـ TypeScript 7
سيُشحن TypeScript 7.0 مع المترجم المبني على Go. لن تحتاج تغيير أكوادك — فقط طريقة استدعاء المترجم. يُقدّم مترجم Go:
- بناء أولي أسرع بـ 10 أضعاف مقارنة بـ TypeScript 6.0
- معالجة ملفات متوازية باستخدام Go goroutines
- بديل مباشر لـ CLI الحالية
tsc
للاستعداد الآن:
- أزل جميع استخدامات
ignoreDeprecations: "6.0"— ستُسبّب أخطاء في TypeScript 7 - تأكد من خلوّ
tsconfig.jsonمن الخيارات المتقادمة - اختبر مع الإصدار الليلي من TypeScript 7 إذا أردت تغذية راجعة مبكرة:
npm install typescript@next --save-devاستكشاف الأخطاء وإصلاحها
"strict مُفعَّل لكنني أريد الهجرة تدريجياً"
فعّل علامات strict الفردية بدلاً من strict: true الشاملة:
{
"compilerOptions": {
"strict": false,
"strictNullChecks": true,
"noImplicitAny": true,
"strictFunctionTypes": true
}
}"Module not found بعد تغيير moduleResolution إلى bundler"
يسمح وضع bundler بالاستيرادات بدون امتداد لكنه يتطلب دعم الـ bundler لتوسيع الامتدادات. إذا كنت تستخدم tsc مباشرة للإصدار، استخدم "moduleResolution": "node16" بدلاً من ذلك.
"تعارض أنواع Temporal مع الـ polyfill"
أزل حزمة الـ polyfill ومدخلها في @types. مع TypeScript 6.0، أنواع Temporal مدمجة:
npm uninstall temporal-polyfill @types/temporal-polyfillالخطوات التالية
- اقرأ ملاحظات إصدار TypeScript 6.0 الرسمية
- استكشف توثيق Temporal API
- تابع خارطة طريق TypeScript 7 للتحديثات على مترجم Go
- اطلع على درسنا حول التحقق من المخطط مع Zod v4
الخلاصة
TypeScript 6.0 إصدار جسر. يُحدّث أدوات اللغة بإزالة الإرث العقدي القديم، ويُعزّز الإعدادات الافتراضية لتعكس الطريقة التي يضبط بها المطورون مشاريعهم فعلاً اليوم، ويُقدّم Temporal API كأول أصيل JavaScript جديد تُحدّد له TypeScript أنواعاً منذ سنوات.
الهجرة مباشرة: شغّل npx ts5to6، ثبّت إعداداتك الافتراضية صراحةً، عالج انتهاكات strict تدريجياً، وانتهيت. مشروعك — ونسختك المستقبلية التي تنتظر بناءات أسرع بعشرة أضعاف — ستشكرك على ذلك.