الكتابات/tutorial/2026/06
Tutorial3 يونيو 2026·30 دقيقة

دليل TypeScript 6.0 الشامل: المميزات الجديدة والتغييرات الجوهرية والهجرة

احترف TypeScript 6.0 — آخر إصدار مبني على JavaScript. تعلّم المميزات الجديدة والتغييرات الجوهرية وإعدادات tsconfig الافتراضية ودعم Temporal API وكيفية الهجرة من TypeScript 5.x.

صدر 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)

ما ستتعلمه

بنهاية هذا الدليل ستكون قد:

  1. هاجرت ملف tsconfig.json بالكامل ليتوافق مع TypeScript 6.0
  2. طبّقت أمثلة عملية على كل ميزة جديدة جوهرية
  3. فهمت أنواع Temporal API المدمجة وكيفية استخدامها
  4. استوعبت ما يعنيه 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
strictfalsetrue
modulecommonjsesnext
targetes3es2025
moduleResolutionnodebundler
esModuleInteropfalsetrue
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 يُفعّل مجموعة من علامات الصرامة:

  • strictNullChecks
  • strictFunctionTypes
  • strictBindCallApply
  • strictPropertyInitialization
  • noImplicitAny
  • noImplicitThis
  • useUnknownInCatchVariables

إذا لم يكن مشروعك يملك 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

للاستعداد الآن:

  1. أزل جميع استخدامات ignoreDeprecations: "6.0" — ستُسبّب أخطاء في TypeScript 7
  2. تأكد من خلوّ tsconfig.json من الخيارات المتقادمة
  3. اختبر مع الإصدار الليلي من 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 كأول أصيل JavaScript جديد تُحدّد له TypeScript أنواعاً منذ سنوات.

الهجرة مباشرة: شغّل npx ts5to6، ثبّت إعداداتك الافتراضية صراحةً، عالج انتهاكات strict تدريجياً، وانتهيت. مشروعك — ونسختك المستقبلية التي تنتظر بناءات أسرع بعشرة أضعاف — ستشكرك على ذلك.