Menu
flag Ar iconالعربيةdown icon

التعليقات في TypeScript: JSDoc و@ts-ignore و@ts-expect-error

تستخدم TypeScript تعليقات JavaScript بصيغتي // و/* */، إضافة إلى تعليقات JSDoc بصيغة /** */ التي تعرضها المحررات عند التمرير. وتقرأ أيضًا بعض التعليقات الخاصة: @ts-expect-error و@ts-ignore و@ts-nocheck و@ts-check وتوجيهات /// <reference>.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تعليقات TypeScript هي تعليقات JavaScript: // لبقية السطر و/* */ للكتلة. التعليق الكتلي الذي يبدأ بـ /** تعليق توثيق (JSDoc)، تعرضه المحررات عند التمرير فوق ما يوثقه. وفوق ذلك تقرأ TypeScript بعض التعليقات الخاصة التي تغيّر طريقة فحص المترجم لكودك.

الناتج:

212

لا تؤثر التعليقات في البرنامج. ولا تؤثر في فحص الأنواع أيضًا، باستثناء تعليقات التوجيه التي نشرحها أدناه.

تعليقات السطر الواحد والتعليقات الكتلية

يحوّل // كل ما بعده في السطر إلى تعليق، وهذه أيضًا الطريقة السريعة لتعطيل سطر من الكود. أما /* */ فيمكن أن يقع في منتصف سطر أو يغطي أسطرًا كثيرة.

التعليقات الكتلية لا تتداخل. أول */ ينهي التعليق، لذلك يتعطل إحاطة كود يحتوي أصلًا على تعليق كتلي:

/* outer comment /* inner comment */ this text is now code */

عندها يحاول المترجم قراءة this text is now code */ ككود ويبلّغ عن خطأ صياغة. لتحويل منطقة تحتوي على تعليقات كتلية إلى تعليق، استخدم // في كل سطر؛ ومعظم المحررات تفعل ذلك بـ Ctrl+/ (Cmd+/ على macOS).

تعليقات التوثيق JSDoc

تعليق /** ... */ الموضوع مباشرة قبل دالة أو صنف أو method أو خاصية أو interface أو متغير يوثّقه. تعرض المحررات نصه في تلميح التمرير وفي الإكمال التلقائي، وتحوّله أدوات توليد التوثيق مثل TypeDoc إلى صفحات مرجعية. ويستخدم TSDoc، وهو معيار لهذه التعليقات في كود TypeScript بدأته Microsoft، الصياغة نفسها للوسوم الشائعة:

الوسممعناه
@param name descriptionيصف معاملًا
@returns descriptionيصف القيمة المُعادة
@throws descriptionيصف خطأ قد ترميه الدالة
@exampleيبدأ كتلة مثال، يتبعها عادة كتلة كود
@deprecated reasonيعلّم واجهة برمجية على أنها مهملة؛ وتعرضها المحررات مشطوبة
@see أو {@link Name}يشير إلى كود ذي صلة
@remarksشرح أطول بعد سطر الملخص

في ملف .ts لا تكرر الأنواع في JSDoc. التعليقات التوضيحية في الكود هي الأنواع، ووسوم أنواع JSDoc تُتجاهل هناك: /** @type {string} */ const v: number = 5; يُترجم دون اعتراض لأن : number وحده هو المعتبر.

في المحرر، التمرير فوق transfer أو balance في أي مكان من المشروع يعرض هذه الأوصاف.

تعليم الكود على أنه مهمل

لا يسبب @deprecated خطأ ترجمة. إنه يخبر المحررات بأن تعرض كل استخدام للدالة المهملة بخط يشطبها مع السبب عند التمرير، وهذه الطريقة اللطيفة لتوجيه المستدعين إلى البديل:

الناتج:

$19.99
19.99 EUR

@ts-expect-error و @ts-ignore

يُسكت هذان التعليقان أخطاء الأنواع في السطر الذي يليهما. أحيانًا يكون هذا هو القرار الصحيح: اختبار يتحقق من طريقة تعامل دالة مع مدخلات خاطئة وقت التشغيل، أو نقص معروف في أنواع مكتبة.

الناتج:

runtime error: text.toUpperCase is not a function

دون التعليق يكون shout(42) خطأ ترجمة (TS2345). ومعه يُترجم الملف ويصل الاستدعاء إلى وقت التشغيل، وهذا هو الغرض من الاختبار.

يظهر الفرق بين التوجيهين عندما يختفي الخطأ. يصر @ts-expect-error على وجود خطأ ليُسكته، فيصبح التعليق الذي لم يعد لازمًا خطأ بحد ذاته:

index.ts(6,1): error TS2578: Unused '@ts-expect-error' directive.

أما // @ts-ignore في المكان نفسه فيبقى صامتًا، أثناء وجود الخطأ وبعد زواله. ولهذا يكون @ts-expect-error الخيار الافتراضي الأفضل: عندما يصلح أحدهم الأنواع، يخبرك المترجم بأن الإسكات يمكن حذفه. أضف دائمًا سببًا بعد التوجيه، كما في المثال أعلاه، حتى يعرف القارئ التالي لماذا وُضع.

يغطي كلاهما السطر التالي فقط وكل الأخطاء فيه. ولتجاوز النوع لقيمة كاملة، يكون as unknown as T الصريح أو الفحص وقت التشغيل أوضح عادة من تعليق إسكات.

@ts-nocheck و @ts-check

يعطّل // @ts-nocheck في أعلى الملف فحص الأنواع للملف كله. يجب أن يأتي أولًا، قبل أي كود: إذا وُضع في موضع أدنى يُتجاهل وتظل الأخطاء تظهر.

// @ts-nocheck
const n: number = "not a number"; // no error reported

إنه مفيد أثناء ترحيل قاعدة كود JavaScript كبيرة، وعلامة على مشكلة في أي مكان آخر.

ويفعل // @ts-check العكس في ملف JavaScript: يفعّل فحص الأنواع لذلك الملف .js، باستخدام الاستنتاج وأنواع JSDoc، حتى عندما يكون checkJs معطلًا في tsconfig.json (يجب أن يظل الملف جزءًا من المشروع، عبر allowJs):

// @ts-check

/**
 * @param {number} cents
 * @returns {string}
 */
function formatCents(cents) {
    return (cents / 100).toFixed(2);
}

formatCents("12"); // error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

في ملفات JavaScript تكون وسوم JSDoc هي الأنواع، وبهذه الطريقة تحصل مشاريع كثيرة على فحص الأنواع دون تحويل الملفات إلى .ts.

توجيهات الشرطات الثلاث

التعليق من الشكل /// <reference ... /> في أعلى الملف تمامًا هو توجيه للمترجم:

/// <reference types="node" />
/// <reference lib="es2023.array" />
/// <reference path="./globals.d.ts" />
  • types="node" يضيف حزمة @types إلى البرنامج، كما لو أدرجتها في "types" في tsconfig.json.
  • lib="..." يضيف مكتبة مدمجة إلى البرنامج، مثل الخيار lib.
  • path="..." يضمّن ملفًا آخر، ويُستخدم غالبًا داخل ملفات .d.ts.

في كود التطبيقات تحل جمل import وإعدادات tsconfig.json محل كل استخدام تقريبًا؛ وتصادف هذه التوجيهات غالبًا في ملفات التعريف والكود المولَّد مثل vite-env.d.ts في Vite. وكعرض سريع، يجعل lib دالة مصفوفات أحدث متاحة في هذا الملف:

التعليقات في الناتج المترجم

يحتفظ tsc بالتعليقات في كود JavaScript الذي يكتبه. اضبط "removeComments": true لحذفها؛ والتعليقات التي تبدأ بـ /*! تبقى حتى عندئذ، وهذا هو العرف المتبع لرؤوس التراخيص:

/*! MyLib v1.2.0 | MIT License */

تُنسخ تعليقات JSDoc أيضًا إلى ملفات .d.ts عند تفعيل declaration، فيرى مستخدمو المكتبة الأوصاف في محرراتهم.

الأسئلة الشائعة

كيف أكتب تعليقًا في TypeScript؟

بالطريقة نفسها كما في JavaScript: // يبدأ تعليقًا يمتد إلى نهاية السطر، و/* ... */ يحيط بتعليق يمكن أن يمتد على عدة أسطر. التعليق الكتلي الذي يبدأ بـ /** هو تعليق توثيق (JSDoc)، وتعرضه المحررات عند التمرير فوق الدالة أو الصنف أو الخاصية الموثقة.

ما الفرق بين @ts-ignore و @ts-expect-error؟

كلاهما يُسكت أخطاء الأنواع في السطر التالي. لكن // @ts-expect-error يتحقق أيضًا من وجود خطأ هناك: إذا لم يعد في السطر خطأ، يبلّغ المترجم عن error TS2578: Unused '@ts-expect-error' directive.، فيُلاحظ الإسكات الذي لم يعد لازمًا. أما // @ts-ignore فيبقى صامتًا إلى الأبد. فضّل @ts-expect-error.

كيف أتجاهل أخطاء TypeScript في ملف كامل؟

ضع // @ts-nocheck في أعلى الملف، قبل أي كود. عندها لا يبلّغ المترجم عن أي خطأ أنواع في ذلك الملف (أخطاء الصياغة تظل تظهر). إنها أداة للترحيل؛ ولسطر واحد استخدم // @ts-expect-error بدلًا منها.

هل تبقى التعليقات في كود JavaScript الناتج؟

نعم، يحتفظ tsc بالتعليقات في الناتج افتراضيًا. مع "removeComments": true يحذفها، باستثناء التعليقات التي تبدأ بـ /*!، فهي تُحفظ لرؤوس التراخيص. وعادة تحذفها أدوات التجميع والتصغير في بناء الإنتاج.

هل أكتب الأنواع في تعليقات JSDoc داخل ملف .ts؟

لا. في ملفات .ts تُتجاهل وسوم أنواع JSDoc مثل @type {string} أو @param {number} x في فحص الأنواع؛ التعليقات التوضيحية في الكود هي الأنواع. استخدم JSDoc في ملفات .ts للأوصاف، واستخدم أنواع JSDoc فقط في ملفات .js المفحوصة بـ // @ts-check أو checkJs.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن