TypeScript Academy · درس

التأكيدات المزدوجة ومخاطرها

تعرّفوا إلى الحالات التي يلزم فيها as unknown as T وسبب خطورته

الدرس 3 من 413 خطوة

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

ما هو التأكيد النوعي المزدوج؟

يربط التأكيد النوعي المزدوج عمليتي تحويل باستخدام as، وعادةً ما يمر عبر unknown: value as unknown as T. وهو يفرض تحويلًا قد يرفض المصرّف إجراءه لولا ذلك.

const s = 'hello';
const n = s as unknown as number; // forced
console.log(typeof n); // still 'string' at runtime!

لماذا يمنع TypeScript التحويلات المباشرة

يمنع TypeScript التعبير s as number عندما لا يوجد تداخل بين string وnumber، لأن ذلك يكون غالبًا خطأً واضحًا. ويحميكم هذا الخطأ من التأكيدات غير المنطقية.

const s = 'text';
// const n = s as number; // Error: types do not sufficiently overlap
console.log('Direct unrelated assertion is rejected');

كيف يتيح unknown إجراء التحويل

يمكن إسناد كل نوع إلى unknown، كما يمكن تأكيد unknown على أنه أي نوع. والمرور عبره يحقق قاعدة التداخل على خطوتين، متجاوزًا فحص الأمان بالكامل.

const s = 'text';
const step1 = s as unknown; // always allowed
const step2 = step1 as number; // allowed from unknown
console.log(typeof step2);

التأكيد النوعي المزدوج يخدع المصرّف

تُجمَّع النتيجة بنجاح، لكن قيمة وقت التشغيل لا تتغير. لقد أخبرتم نظام الأنواع بشيء غير صحيح. وقد يتعطل أي كود لاحق يثق بالنوع المؤكَّد بطريقة غير متوقعة.

const fake = 'oops' as unknown as number;
console.log(fake + 1); // 'oops1' — string concatenation at runtime

حالة استخدام خاطئة واقعية

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

type User = { id: number; name: string };
const partial = { id: 1 };
const user = partial as unknown as User;
console.log(user.name); // undefined at runtime

متى يكون التأكيد النوعي المزدوج ضروريًا

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

// Bridging a known-compatible external type:
type LibA = { value: number };
type LibB = { value: number };
const a: LibA = { value: 5 };
const b = a as unknown as LibB; // structurally identical
console.log(b.value);

لماذا يُعد مشكلة في الكود

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

// Treat 'as unknown as' as a red flag in code review.
const data: unknown = JSON.parse('{}');
// Better: validate with a type guard instead of forcing.
console.log('Prefer validation over double assertion');

فضّلوا التحقق

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

type User = { id: number; name: string };
function isUser(v: unknown): v is User {
  return typeof v === 'object' && v !== null &&
    'id' in v && 'name' in v;
}
const raw: unknown = { id: 1, name: 'Sam' };
if (isUser(raw)) console.log(raw.name);

فضّلوا التحويل الصحيح

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

const s = '42';
const n = Number(s); // real conversion
console.log(n + 1, typeof n);

وثّقوا الحالة النادرة الصحيحة

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

type Raw = { ts: number };
type Event = { ts: number };
const raw: Raw = { ts: 100 };
// Safe: Raw and Event are structurally identical.
const ev = raw as unknown as Event;
console.log(ev.ts);

خلاصة الإرشادات

قاعدة عامة: إذا كنتم تكتبون as unknown as، فتوقفوا واسألوا أنفسكم ما إذا كان التحقق أو التحويل سيكون أكثر أمانًا. وفي تسع حالات من أصل عشر، سيكون كذلك.

// Decision: validate? convert? or genuinely bridge identical types?
const input = '7';
const parsed = Number.parseInt(input, 10); // convert, don't force
console.log(parsed);

اختبار سريع

اختبروا مدى فهمكم للتأكيدات النوعية المزدوجة.

مراجعة: التأكيدات النوعية المزدوجة

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

  • يفرض value as unknown as T تحويلًا كان TypeScript سيرفض إجراءه لولا ذلك.
  • ينجح هذا لأن unknown يتداخل مع كل نوع، لكنه لا يغير شيئًا وقت التشغيل.
  • إنه مؤشر على مشكلة في الكود، لأنكم تتجاوزون نظام الأنواع وتفقدون حمايته.
  • فضّلوا التحقق (باستخدام حُرّاس النوع) أو التحويل الفعلي بدلًا من ذلك.

بعد ذلك، سنقارن بين التأكيدات النوعية وحُرّاس النوع وجهًا لوجه.

// Validate, don't force:
const raw: unknown = '99';
const n = typeof raw === 'string' ? Number(raw) : 0;
console.log(n);
البدء مجانًا

تعلم TypeScript مع معلم ذكاء اصطناعي — مجانًا

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

الدورات
101
الدروس
352

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

هل درس «التأكيدات المزدوجة ومخاطرها» مجاني؟

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

ماذا ستتعلم في «التأكيدات المزدوجة ومخاطرها»؟

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

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

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

كم من الوقت يستغرق درس «التأكيدات المزدوجة ومخاطرها»؟

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

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

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

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

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