التعامل الآمن نوعيًا مع unknown
ضيّقوا قيم unknown قبل استخدامها بأمان
التعامل الآمن نوعيًا مع unknown درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
التعامل الآمن مع unknown
إن تحديد نوع البيانات الخارجية على أنه unknown ليس سوى نصف المهمة. أما النصف الآخر فهو تضييق نوعها إلى نوع ملموس قبل استخدامها. يغطي هذا الدرس أهم تقنيات تضييق النوع.
function describe(v: unknown): string {
if (typeof v === 'string') return 'string: ' + v;
if (typeof v === 'number') return 'number: ' + v;
return 'other';
}
console.log(describe('hi'), describe(7), describe(true));تضييق النوع باستخدام typeof
يُعد حارس typeof أبسط الأدوات. فهو يضيّق unknown إلى الأنواع البدائية: string وnumber وboolean وfunction وobject وغيرها.
function double(v: unknown): number {
if (typeof v === 'number') {
return v * 2; // v is number here
}
return 0;
}
console.log(double(21), double('no'));تضييق النوع باستخدام instanceof
بالنسبة إلى مثيلات الأصناف، استخدموا instanceof. فهو يضيّق unknown إلى الصنف المحدد، ويفتح لكم الوصول الآمن إلى أساليبه وخصائصه.
function handle(v: unknown): string {
if (v instanceof Date) {
return v.toISOString(); // v is Date
}
return 'not a date';
}
console.log(handle(new Date(0)));تضييق النوع باستخدام المعامل in
يتحقق المعامل in مما إذا كانت خاصية ما موجودة في كائن، وبذلك يضيّق قيمًا من نوع كائن. أكدوا أولًا أن القيمة كائن غير فارغ، ثم افحصوا مفاتيحه.
function getName(v: unknown): string {
if (typeof v === 'object' && v !== null && 'name' in v) {
return String((v as { name: unknown }).name);
}
return 'anonymous';
}
console.log(getName({ name: 'Ada' }), getName(5));حُرّاس الأنواع المخصصون
حارس النوع المخصص هو دالة يكون نوع إرجاعها value is T. وعندما تُرجع القيمة true، يضيّق TypeScript نوع الوسيط إلى T في موضع الاستدعاء.
function isString(v: unknown): v is string {
return typeof v === 'string';
}
function shout(v: unknown): string {
return isString(v) ? v.toUpperCase() : '?';
}
console.log(shout('hey'), shout(9));حُرّاس أشكال الكائنات
تتألق الحُرّاس المخصصة عند التحقق من أشكال الكائنات. اكتبوا دالة واحدة تتحقق من جميع الحقول المطلوبة، وبعد ذلك يمكن لبقية شيفرتكم الوثوق بالنوع الذي جرى تضييقه.
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;
}
console.log(isUser({ id: 1, name: 'Sam' }), isUser({}));تعيد JSON.parse بيانات شبيهة بـ unknown
نوع JSON.parse محدد على أنه يُرجع any، ما يتجاوز إجراءات الأمان بصمت. ومن أفضل الممارسات: خزّنوا النتيجة على أنها unknown وتحققوا منها قبل الوثوق بشكلها.
function parseConfig(text: string): unknown {
return JSON.parse(text);
}
const raw = parseConfig('{"port":8080}');
console.log(typeof raw);التحقق من JSON بعد تحليله
اجمعوا بين JSON.parse وحارس نوع لتحويل النص غير الموثوق بأمان إلى قيمة محددة النوع. وإذا فشل التحقق، فعالجوا الخطأ بدلًا من الوثوق بالبيانات غير الصحيحة.
type Config = { port: number };
function isConfig(v: unknown): v is Config {
return typeof v === 'object' && v !== null &&
'port' in v && typeof (v as any).port === 'number';
}
const data: unknown = JSON.parse('{"port":8080}');
if (isConfig(data)) console.log('Port:', data.port);تسلسل حُرّاس متعددة
بالنسبة إلى المدخلات المعقدة، اجمعوا الحُرّاس على مراحل: افحصوا الشكل العام أولًا، ثم حسّنوا التحديد تدريجيًا. يضيّق كل حارس النوع أكثر قليلًا، ما ينتج أنواعًا دقيقة وآمنة خطوةً بعد خطوة.
function process(v: unknown): string {
if (Array.isArray(v)) {
if (v.every((x) => typeof x === 'string')) {
return v.join('-');
}
}
return 'invalid';
}
console.log(process(['a', 'b']), process([1, 2]));طرح استثناء عند البيانات غير الصالحة
عندما يفشل التحقق من بيانات مطلوبة، اطرحوا استثناءً. وبدمج ذلك مع مساعد فشل يُرجع never، يظل المسار المعتاد نظيفًا ومحدد النوع جيدًا.
function asNumber(v: unknown): number {
if (typeof v === 'number') return v;
throw new Error('Expected a number');
}
console.log(asNumber(42));
try { asNumber('x'); } catch (e) { console.log('rejected'); }جمع العناصر معًا
النمط الكامل هو: تلقّي البيانات بصفتها unknown، ثم تضييقها باستخدام الحُرّاس، وبعد ذلك التعامل مع النوع الدقيق. هذه هي الحدود الآمنة بين العالم الخارجي غير محدد النوع وشيفرتكم محددة النوع.
type Point = { x: number; y: number };
function isPoint(v: unknown): v is Point {
return typeof v === 'object' && v !== null &&
'x' in v && 'y' in v;
}
const input: unknown = { x: 1, y: 2 };
if (isPoint(input)) console.log(input.x + input.y);تحقق سريع
اختبروا مدى فهمكم للتعامل الآمن مع unknown.
مراجعة: التعامل مع unknown
لقد تعلمتم تضييق unknown باستخدام:
typeofللأنواع البدائية، وinstanceofلمثيلات الأصناف.- المعامل
inلخصائص الكائنات. - حُرّاس الأنواع المخصصين الذين يُرجعون
value is T. - التحقق من نتائج
JSON.parseقبل الوثوق بها.
الدورة التالية: تأكيدات الأنواع والتحويل بينها.
function isNonEmpty(v: unknown): v is string {
return typeof v === 'string' && v.length > 0;
}
console.log(isNonEmpty('hi'), isNonEmpty(''));الأسئلة الشائعة
هل درس «التعامل الآمن نوعيًا مع unknown» مجاني؟
نعم — نص درس «التعامل الآمن نوعيًا مع unknown» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «التعامل الآمن نوعيًا مع unknown»؟
ضيّقوا قيم unknown قبل استخدامها بأمان تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التعامل الآمن نوعيًا مع unknown»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهم unknown مقارنةً بـ any
- نوع never والحالات المستحيلة
- نوع void في الدوال
- التعامل الآمن نوعيًا مع unknown