وثائق TypeScript
مرجع موجز ومدعّم بأمثلة للغة TypeScript. اقرأ المفهوم، شاهد الكود، ثم تدرّب عليه في رحلة Coddy.
ابدأ رحلة موجَّهة في TypeScriptالبداية
- ما هي TypeScriptTypeScript هي JavaScript مع أنواع ثابتة. تضيف أنواعًا إلى القيم، ويتحقق منها المترجم قبل تشغيل الكود، والناتج JavaScript عادية تعمل في أي متصفح وفي Node.js وDeno وBun.
- TypeScript مقابل JavaScriptTypeScript هي JavaScript مع نظام أنواع ثابت يُفحص قبل تشغيل الكود. قارن بينهما جنبًا إلى جنب: الصياغة، وما يكتشفه فاحص الأنواع، وخطوة البناء، وسرعة التشغيل، ومنحنى التعلم، وطريقة ترحيل مشروع JavaScript.
- تثبيت TypeScriptثبّت TypeScript باستخدام npm كاعتمادية تطوير في المشروع، وتحقق من الإصدار بـ npx tsc --version، وأنشئ ملف tsconfig.json بـ tsc --init، وترجم أول ملف لك. يغطي التثبيت العام وpnpm وYarn وBun والأخطاء الشائعة.
- تشغيل TypeScriptخمس طرق لتشغيل ملف .ts: الترجمة بـ tsc ثم تشغيل JavaScript، أو التشغيل المباشر بـ node file.ts (حذف الأنواع)، أو استخدام tsx أو ts-node، أو Deno وBun. أيها يفحص الأنواع، وما الصياغة التي يدعمها كل منها، وأيها تختار.
- tsconfig.jsonملف tsconfig.json يجعل المجلد مشروع TypeScript ويضبط خيارات المترجم. الخيارات المهمة (target وmodule وmoduleResolution وstrict وrootDir وoutDir وinclude وlib وtypes وnoEmit وskipLibCheck)، وإعداد مقترح للبداية، وextends، وما غيّرته TypeScript 7.
- TypeScript 7TypeScript 7 هو مترجم TypeScript بعد إعادة كتابته بلغة Go كبرنامج أصلي: أسرع بنحو عشر مرات، بالأمر tsc نفسه واللغة نفسها. ما الذي تغيّر للمستخدمين (قيم افتراضية جديدة، وخيارات محذوفة، وغياب واجهة JavaScript البرمجية)، وما الأدوات التي ما زالت تحتاج إلى TypeScript 6، وكيف تترقى.
- التعليقاتتستخدم TypeScript تعليقات JavaScript بصيغتي // و/* */، إضافة إلى تعليقات JSDoc بصيغة /** */ التي تعرضها المحررات عند التمرير. وتقرأ أيضًا بعض التعليقات الخاصة: @ts-expect-error و@ts-ignore و@ts-nocheck و@ts-check وتوجيهات /// <reference>.
- TypeScript مقابل PythonTypeScript وPython لغتان عاليتا المستوى وتعتمدان على جمع المهملات، لكن TypeScript تفحص أنواعها قبل تشغيل الكود، بينما تلميحات الأنواع في Python اختيارية ومتجاهلة وقت التشغيل. مقارنة جنبًا إلى جنب للأنواع وبيئة التشغيل والسرعة والنظم البيئية ومجالات الاستخدام، مع البرنامج نفسه باللغتين.
الأنواع الأساسية
- الأنواع الأساسيةالأنواع المدمجة في TypeScript: string وnumber وboolean وbigint وsymbol وnull وundefined، إضافة إلى لمحة عن المصفوفات والكائنات. كيف تكتب تعليق نوع، ولماذا لا يوجد نوع للأعداد الصحيحة، ولماذا تكتب string بدل String.
- استنتاج الأنواعتستنتج TypeScript معظم الأنواع من القيم التي تكتبها. تعرّف على ما تستنتجه للمتغيرات، والفرق بين let وconst، والكائنات والمصفوفات والقيم المُعادة، وكيف تحصل دوال الاستدعاء على أنواعها من السياق، وأين ما زلت تحتاج إلى كتابة النوع.
- النصوصالعمل مع النصوص في TypeScript: إدراج القيم باستخدام template literals، والنصوص متعددة الأسطر، والتحقق من احتواء نص على نص فرعي، والدوال الشائعة والأنواع التي تعيدها، وأنواع النصوص الحرفية.
- تحويل النص إلى رقمحوّل النص إلى رقم في TypeScript باستخدام Number() أو parseInt() أو parseFloat() أو + الأحادي، وتعرّف على طريقة تعامل كل منها مع مدخلات مثل "42px" و"" و"1e3"، وتحقق من NaN بأمان، وحوّل الأرقام إلى نصوص من جديد.
- المصفوفاتكيف تحدد أنواع المصفوفات في TypeScript: الفرق بين T[] وArray<T>، ومصفوفات الكائنات، والمصفوفات التي تحمل عدة أنواع، والمصفوفات للقراءة فقط، وما تعيده map وfilter وreduce وfind. إضافة إلى مشكلة includes مع المصفوفات الحرفية.
- Tuplesالـ tuple في TypeScript مصفوفة بعدد ثابت من العناصر يُعرف نوع كل منها بحسب موضعه، مثل [string, number]. تعرّف على الصياغة، والعناصر المسماة والاختيارية وعناصر rest، والـ tuples للقراءة فقط وas const، وإعادة tuple من دالة، والفرق بين tuple والمصفوفة.
- أنواع الكائناتكيف تحدد أنواع الكائنات في TypeScript: أنواع الكائنات المضمّنة، والخصائص الاختيارية بـ ?، وخصائص readonly، والكائنات المتداخلة، والدوال، وفحص الخصائص الزائدة، والفرق بين object و{} وObject.
- Enumsالـ enum في TypeScript مجموعة مسماة من الثوابت، مثل enum Direction { Up, Down }. تعرّف على enums الرقمية والنصية، وكود JavaScript الذي تُترجم إليه، والتعيين العكسي، والتكرار على enum، وconst enum، ومتى يكون union من النصوص الحرفية أو كائن as const خيارًا أفضل.
الأنواع الخاصة
- الأنواع الحرفيةالنوع الحرفي نوع له قيمة واحدة بالضبط، مثل "GET" أو 404. تعرّف على الأنواع الحرفية للنصوص والأرقام والقيم المنطقية، وunion من القيم الحرفية، ولماذا يتوسع let ولا يتوسع const، وما الذي يفعله as const، ومعاملات النوع const.
- any مقابل unknownيقبل any وunknown كل القيم. يوقف any فحص الأنواع لتلك القيمة، بينما يجبرك unknown على فحص القيمة قبل استخدامها. تعرّف على الفروق، وطريقة تضييق unknown، وnoImplicitAny، والمواضع التي يتسلل منها any إلى كود له أنواع.
- النوع nevernever هو النوع الذي لا قيم له. إنه نوع القيمة المُعادة للدوال التي لا تنتهي أبدًا، والنوع الذي يتبقى عندما يستبعد التضييق كل الحالات، والأداة وراء فحوص switch الشاملة. تعرّف على مصادره والفرق بينه وبين void.
- null و undefinedمع strictNullChecks يصبح null وundefined نوعين منفصلين تجبرك TypeScript على معالجتهما. تعرّف على طرق فحصهما، وoptional chaining (?.)، وعلامة الاستفهام المزدوجة (??) و??=، والفرق بين الخاصية الاختيارية و| undefined.
- تأكيد عدم الفراغ (!)علامة التعجب بعد قيمة، مثل user!، هي عامل تأكيد عدم الفراغ (non-null assertion): تحذف null وundefined من النوع دون أي فحص وقت التشغيل. تعرّف على ما يفعله x!، وصيغتي تأكيد الإسناد let x!: T وprop!: T، ولماذا هما خطرتان، والبدائل الأكثر أمانًا.
الواجهات والأسماء المستعارة للأنواع
- الواجهات (Interfaces)تسمّي الواجهة (interface) شكل الكائن: الخصائص التي يملكها والأنواع التي تحملها. تعرّف على طريقة تعريفها، والخصائص الاختيارية وreadonly، والدوال، وindex signatures، والتوسيع، والتطبيق في صنف، ودمج التصريحات، والواجهات العامة، وطريقة إعطاء الواجهة قيمًا افتراضية.
- Type Aliasesيعطي type alias اسمًا لأي نوع باستخدام الكلمة المفتاحية type: أشكال الكائنات، وunion، وtuples، والدوال، والأنواع العامة، والأنواع التعاودية. تعرّف على الصياغة، وشكل كل صيغة، ولماذا الاسم المستعار مجرد اسم وليس نوعًا جديدًا منفصلًا.
- interface مقابل typeيصف interface وtype كلاهما أشكال الكائنات، وفي أغلب الأحيان يعمل أي منهما. تعرّف على الفروق الحقيقية: دمج التصريحات، وunion وmapped types، وextends مقابل intersection، وindex signatures الضمنية، ورسائل الأخطاء وأداء المترجم، مع قاعدة واضحة للاختيار.
- الكلمة extendsتبني الكلمة المفتاحية extends نوعًا من نوع آخر. تعرّف على توسيع interface (من واجهة واحدة أو عدة واجهات)، وتوسيع type alias بـ &، وتجاوز نوع خاصية، واستبدال الخصائص بـ Omit، ومعنى extends في الأصناف وقيود الأنواع العامة والأنواع الشرطية.
- أنواع Unionنوع union مثل string | number يعني أن القيمة يمكن أن تكون أيًا من عدة أنواع. تعرّف على ما يمكنك فعله بـ union (فقط ما يدعمه كل عضو)، وطريقة تضييقه، وunion من القيم الحرفية وأنواع الكائنات، والفرق بين (A | B)[] وA[] | B[].
- أنواع Intersectionنوع intersection مثل A & B يصف قيمة هي A وB في الوقت نفسه، فتملك كل أعضاء الاثنين. تعرّف على دمج أنواع الكائنات بـ &، ولماذا تصبح الخصائص المتعارضة never، وكيف تحتفظ intersection بين أنواع union بالأعضاء المشتركة فقط، ومتى تستخدم extends بدلًا منها.
- Discriminated Unionsالـ discriminated union هو union من أنواع كائنات تشترك في خاصية وسم حرفية، مثل kind أو status. فحص الوسم يضيّق الكائن كله. تعرّف على النمط، والتضييق بـ switch، والفحص الشامل بـ never، وكيف تنمذج نتائج API وحالة الطلبات وآلات الحالة.
الدوال
- الدوالكيف تحدد أنواع الدوال في TypeScript: حدد نوع كل معامل، واكتب نوع القيمة المُعادة أو دعه يُستنتج، واستخدم void للدوال التي لا تعيد شيئًا، وحدد أنواع الدوال السهمية وتعبيرات الدوال والدوال غير المتزامنة ومعامل this.
- أنواع الدوالكيف تكتب نوع دالة في TypeScript: صياغة السهم (a: number) => string، وtype aliases للدوال، وتحديد أنواع الدوال السهمية والـ callbacks، وcall signatures وconstruct signatures، ولماذا النوع Function متساهل أكثر من اللازم.
- المعاملات الاختياريةاجعل معاملًا اختياريًا في TypeScript بـ ?، أو أعطه قيمة افتراضية، أو اجمع أي عدد من الوسائط بمعامل rest. يغطي قواعد الترتيب، والفرق بين الوسيط المحذوف وundefined، وكائنات الخيارات، والمعاملات الاختيارية في أنواع الدوال.
- تحميل الدوال الزائديتيح التحميل الزائد للدوال في TypeScript أن تكون لدالة واحدة عدة توقيعات استدعاء، لكل منها نوع قيمة مُعادة خاص. تعرّف على نمط توقيعات التحميل مع التطبيق، والقواعد التي يفحصها المترجم، ومتى يكون معامل union أفضل، والتحميل الزائد في الأصناف.
تضييق الأنواع وفحصها
- تضييق الأنواعالتضييق (narrowing) هو الطريقة التي تحوّل بها TypeScript نوعًا واسعًا مثل string | number إلى نوع محدد داخل if أو switch أو بعد return مبكرة. كل صيغ التضييق في مكان واحد: typeof، والقيم المنطقية، والمساواة، وin، وinstanceof، والإسناد، وtype predicates، وdiscriminated unions.
- العامل typeofللعامل typeof وظيفتان في TypeScript. في الكود هو عامل JavaScript الذي يعيد "string" و"number" و"object" وغيرها وقت التشغيل، وتضيّق TypeScript الأنواع بناءً عليه. وفي الأنواع هو استعلام نوع ينسخ نوع متغير، كما في keyof typeof obj وReturnType<typeof fn>.
- العامل instanceofيفحص instanceof وقت التشغيل ما إذا كان كائن قد أُنشئ بصنف معين، وتضيّق TypeScript المتغير إلى ذلك الصنف. كيف يعمل مع أصنافك وأصناف Error الفرعية، ولماذا لا يستطيع فحص الواجهات وtype aliases، وأين يعطي إجابات مفاجئة.
- Type Guardsالـ type guard فحص وقت التشغيل تفهمه TypeScript. تعرّف على الفحوص المدمجة، وكيف تكتب فحصك الخاص بـ type predicate بصيغة value is Type، وكيف تتحقق من أن كائنًا من نوع معين، ودوال التأكيد بـ asserts، والتحقق من البيانات من النوع unknown.
- تأكيد الأنواعالكلمة المفتاحية as تخبر TypeScript أن تعامل قيمة كنوع آخر. هي ليست تحويلًا: لا شيء يُحوَّل أو يُفحص وقت التشغيل. تعرّف على صيغة as وصيغة الأقواس الزاوية، وما يسمح به المترجم، والتأكيد المزدوج عبر unknown، ومتى يكون الـ type guard الأداة الأفضل.
- العامل satisfiesالعامل satisfies يتحقق من أن قيمة تطابق نوعًا دون أن يغيّر نوعها المستنتج. تعرّف على ما يفعله، وكيف يُقارن بتوصيف النوع وبـ as (الكائن نفسه مكتوبًا بثلاث طرق)، وكيف يجتمع مع as const، ولماذا يناسب كائنات الإعدادات.
الأصناف
- الأصنافالأصناف في TypeScript هي أصناف JavaScript مع حقول وتوابع ودوال بناء بأنواع محددة. تعرّف على تعريف الحقول وكيف يعمل strictPropertyInitialization، وكيف تحدد نوع this، والـ getters والـ setters، والأعضاء الثابتة، وimplements، وكيف يعمل الصنف نوعًا أيضًا.
- دوال البناءكيف تحدد أنواع دالة البناء لصنف في TypeScript: معاملات بأنواع ومعاملات اختيارية، وخصائص المعاملات مثل constructor(private name: string)، وترتيب تهيئة الحقول، وتحميل دالة البناء، واستدعاء super في الأصناف الفرعية، ودوال البناء الخاصة، وأنواع دوال البناء مع new.
- معدّلات الوصولفي TypeScript ثلاثة معدّلات وصول: public وprivate وprotected، إضافة إلى readonly. تعرّف على ما يسمح به كل منها، ولماذا private في TypeScript فحص وقت الترجمة بينما حقول #private في JavaScript تُفرض وقت التشغيل، وأيها تختار.
- الوراثةوراثة الأصناف في TypeScript: extends وsuper، وإعادة تعريف التوابع بأنواع متوافقة، والكلمة المفتاحية override والخيار noImplicitOverride، والأعضاء protected، وإعادة تعريف الحقول بـ declare، ومتى يكون implements الأداة الأفضل.
- الأصناف المجردةالصنف المجرد في TypeScript صنف أساسي لا يمكن إنشاء نسخ منه، ويمكنه ترك توابع لتنفذها الأصناف الفرعية. تعرّف على التوابع والخصائص المجردة، ونمط template method، وأنواع دوال البناء المجردة، ومتى يكون الـ interface الخيار الأفضل.
- Decoratorsالـ decorators دوال تغلّف أعضاء الصنف أو تستبدلها بصيغة @. تعرّف على الـ decorators القياسية التي تدعمها TypeScript دون أي خيار (للصنف والتابع والـ getter والحقل والـ accessor)، ومصانع الـ decorators، وaddInitializer، وكيف تختلف عن experimentalDecorators القديمة التي تستخدمها Angular وNestJS.
الأنواع العامة
- Genericsالـ generics تتيح لدالة أو interface أو نوع أو صنف العمل مع أنواع كثيرة مع إبقائها مترابطة: ما يدخل يحدد ما يخرج. تعرّف على الدوال العامة، واستنتاج وسائط النوع، وتعدد معاملات النوع، والـ interfaces والأصناف العامة، والقيم الافتراضية، ومتى لا تستخدم الـ generics.
- قيود الـ Genericsقيد الـ generic، أي T extends Something، يحدد الأنواع التي يقبلها معامل النوع ويسمح للدالة باستخدام ما يضمنه القيد. يشرح extends مع أشكال الكائنات والـ interfaces، وK extends keyof T للوصول الآمن إلى الخصائص، والقيود على الأنواع البدائية، والأخطاء التي ستواجهها.
عوامل الأنواع
- العامل keyofيأخذ keyof نوع كائن ويعطيك union من أسماء خصائصه. تعرّف على keyof مع الـ interfaces، وkeyof typeof للكائنات العادية، والوصول إلى الخصائص بأنواع دقيقة عبر الـ generics، وتوقيعات الفهرسة (string | number)، ولماذا يعيد Object.keys النوع string[].
- أنواع الوصول المفهرسنوع الوصول المفهرس (indexed access type) يقرأ نوع خاصية من نوع آخر: Person["age"] هو number. تعرّف على T["key"]، ومفاتيح الـ union، وT[keyof T]، وT[number] لعناصر المصفوفات، وفهارس الـ tuples، و(typeof arr)[number] لتحويل مصفوفة const إلى union.
- Mapped Typesالنوع المعيّن (mapped type) يبني نوع كائن جديدًا بالمرور على المفاتيح: { [K in keyof T]: ... }. تعرّف على الصيغة، والمعدّلين readonly و? مع + و-، وإعادة تسمية المفاتيح بـ as، وتصفية المفاتيح، وكيف تُكتب Partial وReadonly وRequired وPick وRecord.
- الأنواع الشرطيةالنوع الشرطي يختار أحد نوعين بناءً على اختبار: T extends U ? X : Y. تعرّف على الصياغة، وكيف تتوزع الأنواع الشرطية على union (وكيف توقف ذلك)، واستخراج الأنواع بـ infer، وكيف تكتب ReturnType بنفسك.
- أنواع Template Literalأنواع template literal تبني أنواعًا حرفية نصية بصياغة علامات backtick نفسها المستخدمة في قوالب النصوص في JavaScript: `on${Capitalize<E>}`. تعرّف على الصياغة، وكيف تتضاعف أعضاء union، وUppercase وCapitalize، وأنماطًا مثل `${number}px`، وgetters عبر mapped types، وتحليل النصوص بـ infer.
- Branded Typesالنوع الموسوم (branded type) نوع بدائي يحمل وسمًا غير مرئي، مثل string & { readonly __brand: "UserId" }، فلا يمكن تمرير UserId حيث يُتوقع OrderId. تعرّف على طريقة عمل الوسوم، ودوال الإنشاء التي تتحقق من المدخلات، ومساعد Brand عام، ووسوم unique symbol، والأرقام الموسومة.
الأنواع المساعدة
- Utility Typesكل أنواع الأدوات (utility types) المدمجة في TypeScript في مكان واحد: Partial وRequired وReadonly وPick وOmit وRecord وExclude وExtract وNonNullable وParameters وReturnType وAwaited وأنواع النصوص وغيرها، لكل منها وصف في سطر واحد ومثال قابل للتشغيل.
- RecordRecord<K, V> هو نوع الكائن الذي مفاتيحه K وكل قيمه V. تعرّف على Record بمفاتيح نصية وبمفاتيح union (كل مفتاح إلزامي)، وPartial<Record>، والمرور على Record بمفاتيح ذات أنواع، وفخ المفتاح المفقود، ومتى تستخدم index signature أو Map بدلًا منه.
- Partial وRequiredPartial<T> يجعل كل خصائص T اختيارية، وهذا بالضبط نوع كائن التحديث أو الـ patch. تعرّف على Partial في دوال التحديث، ولماذا هو سطحي، وكيف تكتب DeepPartial، وفخ undefined الصريحة، وعكسه Required<T>.
- OmitOmit<T, K> ينشئ نوعًا فيه كل خصائص T عدا المفاتيح K. تعرّف على Omit بمفتاح واحد وبعدة مفاتيح، واستبدال نوع خاصية، وحذف الخاصية وقت التشغيل، والفرق بين Omit وExclude وPick، ولماذا يقبل Omit مفاتيح غير موجودة، ونسخة Omit صارمة، وOmit على أنواع union.
- PickPick<T, K> ينشئ نوعًا فيه خصائص T التي مفاتيحها في K فقط. تعرّف على Pick بمفتاح واحد أو عدة مفاتيح، وكيف يفحص المفاتيح، والفرق بين Pick وOmit، والاختيار من أنواع متداخلة، ودالة pick() بأنواع صحيحة، واختيار الخصائص حسب نوع قيمتها.
- readonly وReadonlyالمُعدِّل readonly ونوع الأداة Readonly<T> يمنعان الكود من إعادة إسناد الخصائص. تعرّف على خصائص readonly وحقول الأصناف، وReadonly<T>، والمصفوفات للقراءة فقط (readonly T[] وReadonlyArray)، وReadonlyMap وReadonlySet، ولماذا readonly سطحي ويعمل وقت الترجمة فقط، ومقارنته مع Object.freeze وas const.
- Exclude وExtractExclude وExtract وNonNullable ترشّح أعضاء نوع union. تعرّف على ما يُبقيه كل منها وما يحذفه، وكيف تختار أعضاء union حسب شكلها، وكيف تُبنى من الأنواع الشرطية، وكيف تختلف عن Omit وPick.
- ReturnType وParametersReturnType وParameters وConstructorParameters وInstanceType وAwaited تستخرج الأنواع من الدوال والأصناف والوعود. تعرّف على استخدامها مع typeof، وكيف تحصل على نوع نتيجة دالة async، وما يحدث مع التحميل الزائد والـ generics، وكيف يُبنى ReturnType بـ infer.
الحلقات والمجموعات
- الحلقاتكل طرق التكرار في TypeScript والأنواع التي تعطيها كل منها: حلقة for الكلاسيكية، وfor...of على المصفوفات وMaps والنصوص، وfor...in ومفاتيحها النصية، وforEach (بلا break ولا await)، والحلقات على مفاتيح الكائنات بأنواع صحيحة، وwhile.
- جملة switchجملة switch في TypeScript: الصياغة، وكيف يضيّق كل case نوع union، وجمل switch الشاملة التي تفشل ترجمتها عند غياب حالة، ونمط switch (true)، والانتقال إلى الحالة التالية (fallthrough)، ونطاق الكتل.
- Mapكيف تستخدم Map في TypeScript: إنشاء Map<K, V> بأنواع محددة، ولماذا تعيد get النوع V | undefined، وset وhas وdelete، والتكرار بترتيب الإدراج، والمفاتيح من نوع كائن، والتحويل من الكائنات وJSON وإليها، والفرق بين Map والكائن وRecord، وتحديد أنواع array.map().
- القاموس (Dictionary)لا يوجد في TypeScript صنف قاموس أو hashmap؛ تحدد نوع البحث بالمفتاح والقيمة باستخدام index signature أو Record<K, V> أو Map<K, V>. تعرّف على كل منها، وكيف تتحقق من وجود مفتاح، وتضيف وتحذف وتكرر، ولماذا يهم noUncheckedIndexedAccess في القواميس.
البرمجة غير المتزامنة والأخطاء
- Promisesكيف تُحدد أنواع الـ promises في TypeScript: النوع Promise<T>، وتحديد نوع new Promise وresolve، وكيف تغيّر then النوع، ولماذا تعطيك catch النوع any، وPromise.all مع نتائج على شكل tuple، وأنواع نتائج Promise.allSettled، وتغليف واجهات callback بـ promise محدد النوع.
- Async/Awaitكيف تُحدد أنواع async وawait في TypeScript: الدالة async تعيد Promise<T>، وawait تفكّها، والأخطاء تُلتقط بـ try/catch، وawait على المستوى الأعلى تحتاج إلى وحدة ES، والفرق بين الانتظار واحدًا تلو الآخر والانتظار المتوازي، وفخ forEach.
- معالجة الأخطاءمعالجة الأخطاء في TypeScript: لماذا يكون متغير catch من النوع unknown، وكيف تضيّقه بـ instanceof Error، ورمي الأخطاء، وكتابة أصناف أخطاء مخصصة مع name وcause، ونمط النوع Result للأخطاء المتوقعة.
- Sleepلا يوجد في TypeScript دالة sleep مدمجة، لكن سطرًا واحدًا يعطيك واحدة: دالة تعيد Promise<void> يحلّها setTimeout. تعرّف على طريقة انتظارها بـ await، والتوقف داخل الحلقات، وإعادة المحاولة مع تأخير، وإلغاء الانتظار، ولماذا لا يوجد sleep حاجب في JavaScript.
الوحدات والأدوات
- الوحدات (Modules)كل ملف TypeScript فيه import أو export على المستوى الأعلى هو وحدة. تعرّف على التصدير المسمى والافتراضي، وimport type وexport type، وكيف يحدد الخيار module ناتج وحدات ES أو CommonJS، ولماذا يطلب node16 وnodenext الامتداد .js في مسارات الاستيراد.
- Namespacesالـ namespace في TypeScript يجمع القيم والأنواع تحت اسم واحد ويُترجم إلى كائن عادي. تعرّف على الصياغة، وكيف تندمج الـ namespaces مع بعضها ومع الدوال والأصناف، ولماذا حلّت وحدات ES محلها، وأين ما زلت تصادفها: ملفات التعريفات والتوسيع العام.
- ملفات التعريفاتملف .d.ts يصف أنواع كود JavaScript دون أن يحتوي على أي جزء منه، والكلمة declare تفعل الشيء نفسه داخل ملف .ts. تعرّف على طريقة توليد ملفات التعريفات، ودور حزم @types، وكيف تحدد أنواع وحدة بلا أنواع، وكيف يوسّع declare global وتوسيع الوحدات الأنواع الموجودة.
- الوضع الصارم (Strict)الخيار strict: true في tsconfig.json يفعّل مجموعة من فحوص الأنواع: noImplicitAny وstrictNullChecks وstrictPropertyInitialization وخمسة غيرها. تعرّف على ما يكتشفه كل منها، وكيف تفعّل الوضع الصارم في مشروع قائم، والخيارات المفيدة التي لا يتضمنها strict.
- JSONيعيد JSON.parse النوع any، لذلك يثق TypeScript بأي نوع تعطيه للنتيجة. تعرّف على طريقة تحديد نوع JSON المحلَّل، والتحقق منه بـ type guard، وتحويل عينة JSON إلى interface، واستيراد ملفات .json، وما يفعله JSON.stringify بالتواريخ وSet وundefined.
للتعمق أكثر
- أفضل الممارساتثماني عادات في TypeScript تمنع أخطاء حقيقية: أبقِ strict مفعّلًا، واستخدم unknown بدلًا من any، ودع الاستنتاج يعمل، وفضّل union على enum، وافحص الإعدادات بـ satisfies، وصمّم الحالة بـ discriminated unions، وتجنب ! وas، واجعل البيانات readonly. لكل منها مثال قابل للتشغيل قبل وبعد.
- أسئلة المقابلات25 سؤالًا من أسئلة مقابلات TypeScript مع إجابات قصيرة وصحيحة وكود، مرتبة من المبتدئ إلى المتقدم: any مقابل unknown، وinterface مقابل type، والـ generics، والتضييق، والأنواع المساعدة، وmapped types وconditional types، والأنواع البنيوية، وtsconfig، وTypeScript 7.