فهم unknown مقارنةً بـ any
تعرّفوا إلى سبب كون unknown البديل الآمن نوعيًا لـ any
فهم unknown مقارنةً بـ any درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
النوعان الأعلى
يحتوي TypeScript على نوعين يمكنهما الاحتفاظ بأي قيمة: any وunknown. يبدوان متشابهين، لكن سلوكهما مختلف جدًا. واختيار النوع الصحيح مهارة أساسية لكتابة كود آمن من ناحية الأنواع.
let a: any = 5;
let u: unknown = 5;
console.log(a, u);any يعطّل فحص الأنواع
يمثل any مخرجًا لتعطيل فاحص الأنواع لهذه القيمة. يمكنك الوصول إلى أي خاصية أو استدعاء القيمة كدالة، ويبقى المترجم صامتًا حتى عندما يتسبب ذلك في انهيار أثناء التشغيل.
const a: any = 'hello';
console.log(a.toUpperCase()); // OK
// a.doesNotExist(); // no compile error, but crashes at runtimeunknown يجبرك على الفحص
يقبل unknown أي قيمة أيضًا، لكن لا يمكنك استخدامها قبل إثبات ماهيتها. يمنع المترجم الوصول إلى الخصائص والاستدعاءات حتى تضيق النوع.
const u: unknown = 'hello';
// console.log(u.toUpperCase()); // Error: u is unknown
console.log(typeof u);تضييق unknown باستخدام typeof
يضيّق حارس typeof النوع unknown إلى نوع محدد داخل الكتلة. وبعد التضييق، تصبح جميع أساليب ذلك النوع متاحة بأمان.
function shout(value: unknown): string {
if (typeof value === 'string') {
return value.toUpperCase(); // safe here
}
return 'not a string';
}
console.log(shout('hi'), shout(42));لماذا يُعد unknown أكثر أمانًا
يمثل unknown حالة عدم يقين صادقة: «لا أعرف بعد ما هذا». فهو يدفعك إلى التحقق قبل الاستخدام، ويكتشف الأخطاء أثناء الترجمة. أما any فيخفي عدم اليقين والأخطاء فحسب.
function len(value: unknown): number {
if (typeof value === 'string') return value.length;
if (Array.isArray(value)) return value.length;
return 0;
}
console.log(len('abc'), len([1, 2]), len(99));الإسناد إلى unknown ومنه
يمكن إسناد أي قيمة إلى unknown. لكن لا يمكن إسناد unknown إلا إلى unknown أو any — وليس إلى أنواع محددة من دون تضييق. وهذا التباين هو ما يحافظ على أمانه.
let u: unknown = 10;
u = 'now a string';
u = true;
const anyVal: any = u; // allowed
console.log(anyVal);
// const s: string = u; // Errorany ينتشر في الكود
من السمات الخطرة في any أنه ينتشر. بمجرد أن تصبح قيمة ما من النوع any، يصبح كل ما يُشتق منها من النوع any أيضًا، مما يؤدي بصمت إلى تآكل أمان الأنواع في برنامجك.
const a: any = { count: 5 };
const total = a.count + 10; // total is any
const flag = total.whatever; // still any, no error
console.log(total);unknown يحصر الخطر
مع unknown، يبقى عدم اليقين محصورًا في مكانه. يجب أن تضيق النوع صراحةً عند كل حد، ولذلك لا يمكن للعمليات غير الآمنة أن تتسرب إلى أماكن أخرى. يبقى الخطر حيث ينبغي له أن يكون.
const u: unknown = { count: 5 };
if (typeof u === 'object' && u !== null && 'count' in u) {
console.log('Has count property');
}تحديد أنواع حدود API وJSON
لا تضمن البيانات الخارجية — مثل JSON واستجابات الشبكة ومدخلات المستخدم — أي شيء. ويؤدي تحديد نوعها كـunknown بدلًا من any إلى فرض التحقق قبل الوثوق بها، وهو الخيار الآمن الافتراضي.
function parse(text: string): unknown {
return JSON.parse(text);
}
const data = parse('{"id":1}');
if (typeof data === 'object' && data !== null) {
console.log('Got an object');
}متى يكون any مقبولًا
قد يكون any خيارًا عمليًا أحيانًا — في النماذج الأولية السريعة، أو الترحيل التدريجي من JavaScript، أو التكامل مع مكتبات غير محددة الأنواع. لكن تعامل معه كعلامة مؤقتة، لا كعادة. فضّل unknown كلما أمكنك ذلك.
// Migration placeholder, to be typed later
let legacy: any = getLegacyValue();
function getLegacyValue() { return { x: 1 }; }
console.log(legacy.x);مقارنة عملية
جنبًا إلى جنب: تُترجم نسخة any بنجاح، لكنها قد تنهار؛ أما نسخة unknown فترفض ترجمة الوصول غير الآمن. يؤدي المترجم وظيفته — حمايتك.
const a: any = 42;
console.log(a.toFixed(2)); // OK by luck
const u: unknown = 42;
if (typeof u === 'number') {
console.log(u.toFixed(2)); // checked, safe
}تحقق سريع
اختبر مدى فهمك للفرق بين unknown وany.
مراجعة: unknown في مقابل any
النقاط الأساسية:
- يعطّل
anyفحص الأنواع وينتشر عبر القيم المشتقة. - يقبل
unknownأي قيمة، لكنه يمنع استخدامها حتى تقوم بتضييق نوعها. - استخدم
unknownللبيانات الخارجية (JSON وواجهات API ومدخلات المستخدم) لفرض التحقق. - احجز
anyللترحيل أو التكامل مع مكتبات غير محددة الأنواع، بوصفه علامة مؤقتة.
بعد ذلك، نستكشف النوع الفارغ: never.
function safeLen(v: unknown): number {
return typeof v === 'string' ? v.length : 0;
}
console.log(safeLen('hello'), safeLen(123));الأسئلة الشائعة
هل درس «فهم unknown مقارنةً بـ any» مجاني؟
نعم — نص درس «فهم unknown مقارنةً بـ any» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «فهم unknown مقارنةً بـ any»؟
تعرّفوا إلى سبب كون unknown البديل الآمن نوعيًا لـ any تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «فهم unknown مقارنةً بـ any»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهم unknown مقارنةً بـ any
- نوع never والحالات المستحيلة
- نوع void في الدوال
- التعامل الآمن نوعيًا مع unknown