0Pricing
TypeScript Academy · درس

التأكيدات مقابل حواجز الأنواع

فضّلوا فحوصات وقت التشغيل على التأكيدات كلما أمكن

التأكيدات مقابل حواجز الأنواع درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

طريقتان لإقناع المصرّف

عندما لا يعرف المصرّف النوع الدقيق لقيمة ما، فلديكم خياران: أن تؤكدوا نوعها (تدّعوا أن لها هذا النوع)، أو أن تتحققوا منه (تثبتوا النوع وقت التشغيل). قد تبدوان متشابهتين، لكنهما توفران مستويات أمان مختلفة جدًا.

function viaAssert(v: unknown): number {
  return (v as number) + 1; // claim
}
function viaGuard(v: unknown): number {
  return typeof v === 'number' ? v + 1 : 0; // prove
}
console.log(viaAssert(5), viaGuard(5), viaGuard('x'));

التأكيدات لا تتحقق من النوع

التأكيد وعد بلا إنفاذ. فإذا كنتم مخطئين، يتسرب الخطأ إلى وقت التشغيل. وتستبدل التأكيدات الأمان بالسهولة.

const v: unknown = 'hello';
const n = v as number;
console.log(n.toFixed(2)); // runtime error: toFixed is not a function

حُرّاس النوع يتحققون وقت التشغيل

يفحص حارس النوع القيمة فعلًا. فإذا نجح الفحص، عرفتم أنتم والمصرّف أن النوع صحيح، إذ يستند تضييق النوع إلى اختبار حقيقي وقت التشغيل.

function toFixed2(v: unknown): string {
  if (typeof v === 'number') return v.toFixed(2);
  return 'N/A';
}
console.log(toFixed2(3.14159), toFixed2('hi'));

دوال حُرّاس النوع المخصصة

غلّفوا الفحوصات المعقدة داخل حارس قابل لإعادة الاستخدام يعيد value is T. وتستفيد قاعدة الكود بأكملها من عملية تحقق واحدة خضعت لاختبارات جيدة.

type Email = { address: string };
function isEmail(v: unknown): v is Email {
  return typeof v === 'object' && v !== null &&
    'address' in v && typeof (v as any).address === 'string';
}
console.log(isEmail({ address: 'a@b.com' }), isEmail(null));

يمكن تركيب الحُرّاس وإعادة استخدامها

لأن الحُرّاس دوال عادية، يمكنكم دمجها واختبارها وإعادة استخدامها. أما التأكيدات فهي ادعاءات متناثرة لا يمكن التحقق منها مركزيًا.

function isString(v: unknown): v is string { return typeof v === 'string'; }
function isNonEmpty(v: unknown): v is string {
  return isString(v) && v.length > 0;
}
console.log(isNonEmpty('hi'), isNonEmpty(''));

دوال التأكيد باستخدام asserts

يوفر TypeScript أيضًا دوال التأكيد. وتستخدم تعليقاتها الخاصة بنوع القيمة الكلمة المفتاحية asserts. فإذا أعادت الدالة التنفيذ بشكل طبيعي، يضيّق المصرّف نوع الوسيط ابتداءً من تلك النقطة؛ أما إذا فشل الشرط، فتلقي الدالة استثناءً.

function assertNumber(v: unknown): asserts v is number {
  if (typeof v !== 'number') throw new Error('not a number');
}
function use(v: unknown): number {
  assertNumber(v); // after this line, v is number
  return v * 2;
}
console.log(use(21));

asserts مقابل value is

يعيد حارس value is T قيمة منطقية تتفرعون بناءً عليها. أما دالة asserts value is T فتلقي استثناءً عند الفشل وتضيّق النوع لبقية النطاق. وكلاهما مدعوم بفحص وقت التشغيل، بخلاف as العادي.

function assertDefined<T>(v: T): asserts v is NonNullable<T> {
  if (v === null || v === undefined) throw new Error('missing');
}
const maybe: string | null = 'ok';
assertDefined(maybe);
console.log(maybe.length); // narrowed to string

مساعدات التأكيد العامة

تُعد دوال التأكيد مناسبة جدًا للشروط المسبقة القابلة لإعادة الاستخدام. ويمكن لمساعد واحد مثل assert(condition) حماية الثوابت في مختلف أجزاء الكود، مع إلقاء استثناء مبكر عند انتهاكها.

function assert(cond: unknown, msg: string): asserts cond {
  if (!cond) throw new Error(msg);
}
function half(n: number): number {
  assert(n % 2 === 0, 'must be even');
  return n / 2;
}
console.log(half(8));

مقارنة مستويات الأمان

بالترتيب من الأكثر أمانًا إلى الأكثر خطورة: تأتي حُرّاس النوع ودوال التأكيد (التي تتحقق وقت التشغيل) فوق تأكيدات as العادية (غير المفحوصة)، وتأتي هذه بدورها فوق التأكيدات النوعية المزدوجة (المضللة فعليًا). استخدموا الأداة الأكثر أمانًا التي تلائم الحالة.

// Safe: guard
function safe(v: unknown) {
  return typeof v === 'string' ? v.trim() : '';
}
console.log(safe('  hi  '));

اختيار الأداة المناسبة

استخدموا حارس النوع عندما تتفرعون بناءً على النوع. واستخدموا دالة التأكيد عندما يجب تحقق شرط مسبق أو ينبغي إيقاف التنفيذ. ولا تستخدموا as إلا عندما يكون تضييق النوع مستحيلًا (مثل تخصيص نوع عنصر في DOM).

function getInput(v: unknown): asserts v is string {
  if (typeof v !== 'string') throw new Error('expected string');
}
const raw: unknown = 'name';
getInput(raw);
console.log(raw.toUpperCase());

تفوز فحوصات وقت التشغيل

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

function parsePort(v: unknown): number {
  if (typeof v === 'number' && Number.isInteger(v)) return v;
  throw new Error('invalid port');
}
console.log(parsePort(8080));

اختبار سريع

اختبروا مدى فهمكم للتأكيدات النوعية وحُرّاس النوع.

مراجعة: التأكيدات النوعية مقابل الحُرّاس

لقد تعلمتم ما يلي:

  • يثبت حُرّاس النوع (value is T) النوع وقت التشغيل، ويتيحون لكم التفرع بناءً عليه.
  • تلقي دوال التأكيد (asserts value is T) استثناءً عند الفشل، وتضيّق النوع بعد ذلك.
  • تدّعي تأكيدات as العادية النوع فقط، ولا توفر أي أمان وقت التشغيل.
  • فضّلوا الأدوات التي تتحقق وقت التشغيل، واحصروا استخدام التأكيدات في الحالات التي لا يستطيع فيها تضييق النوع التعامل معها.

في الدورة التالية: السلسلة الاختيارية ودمج القيم الفارغة.

function isPositive(v: unknown): v is number {
  return typeof v === 'number' && v > 0;
}
console.log(isPositive(5), isPositive(-1));

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

هل درس «التأكيدات مقابل حواجز الأنواع» مجاني؟

نعم — نص درس «التأكيدات مقابل حواجز الأنواع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «التأكيدات مقابل حواجز الأنواع»؟

فضّلوا فحوصات وقت التشغيل على التأكيدات كلما أمكن تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «التأكيدات مقابل حواجز الأنواع»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الكلمة المفتاحية as لتأكيد الأنواع
  2. عامل التأكيد على عدم كون القيمة null
  3. التأكيدات المزدوجة ومخاطرها
  4. التأكيدات مقابل حواجز الأنواع
← العودة إلى TypeScript Academy