TypeScript / المتقدم / الدرس 14
التحقق التنفيذي وقيم المجال
ابدأ الإدخال غير الموثوق بـunknown وافحص البنية والموارد وابنِ تمثيل مجال منتقى بدل تأكيد الثقة.
في هذه الصفحة
أهداف الدرس
- فحص أوليات unknown وكائناتها ومصفوفاتها.
- فصل فحص البنية من قواعد العدد والصلاحيات.
- إرجاع بيانات منتقاة مستقلة أو فشل موثق.
تسجل unknown قرار ثقة لم يُحسم
قد تخالف JSON والتخزين والرسائل والاعتماديات الواجهة المعلنة. تمنع unknown الوصول غير المبرر ولا تفحص وحدها. افحص الحقول وقواعد المجال قبل بناء المقبول. ميّز الصياغة المشوهة من JSON صحيحة ببنية خاطئة؛ فقد تنتج null أو مصفوفة أو أوليات. لا تعد بأن parse<T> اكتشفت T إذا أكدت النتيجة فقط؛ فالأنواع ممحوة ولا تقدم المخطط تلقائيًا.
فحص الحقول وبناء الناتج العام
يرفض المحلل null وغير الكائن قبل count. يتيح in الخاصية كـunknown في الأساس المختار ويثبت الفحص العددي مجالًا آمنًا. ينتقي كائن جديد count فلا ينسخ خاصية خاصة زائدة. هذا لفحص JSON الاصطناعية العادية لا لتحييد proxies أو getters عدائية. صمّم آثار الوصول والنموذج الأولي للكائن الغني وحدّد رفض المفاتيح الزائدة أو تجاهلها.
export {};
type CountData = { count: number };
function decode(value: unknown): CountData | undefined {
if (typeof value !== "object" || value === null || !("count" in value)) { return undefined; }
const count = value.count;
if (typeof count !== "number" || !Number.isSafeInteger(count) || count < 0 || count > 100) { return undefined; }
return { count };
}
console.log(JSON.stringify(decode({ count: 3, privateNote: "omit" })));
console.log(decode({ count: "3" }) === undefined);
{"count":3}
true
يُنقل العد الصحيح للناتج ويُرفض النص الشبيه بالعدد دون تحويل ضمني أو تأكيد.
فحص كل عنصر وتحديد العمل الكلي
يثبت فحص المصفوفة هويتها لا مجال عناصرها. يفحص المحلل قائمة محدودة بأسماء غير فارغة ضمن طول ويبني مصفوفة جديدة دون تعديل حاوية المستدعي. يوضح unknown المحلي فحص العنصر رغم اتساع تعريف المكتبة. حدّ العمق والحجم قبل التكرار المتداخل؛ فلا يمنع نجاح النوع استنزاف الخدمة بإدخال صحيح هائل.
export {};
function names(value: unknown): string[] | undefined {
if (!Array.isArray(value) || value.length > 10) { return undefined; }
const output: string[] = [];
for (const item of value) {
const candidate: unknown = item;
if (typeof candidate !== "string" || candidate.length === 0 || candidate.length > 40) { return undefined; }
output.push(candidate);
}
return output;
}
console.log(JSON.stringify(names(["Mira", "Omar"])));
console.log(names(["Mira", 2]) === undefined);
["Mira","Omar"]
true
يُنسخ النصان الصحيحان ويسبب العدد رفض القائمة الثانية كلها.
فصل الفحص والتطبيع والصلاحية
يقرر الفحص المطابقة ويغير التطبيع البيانات عمدًا كالتشذيب وتحويل الرقم وله سياسة. تحدد الصلاحية من يحق له العمل ولا تثبتها بنية صحيحة. لا تخفِ فشلًا بتحويل أو افتراضي أو صدقية واسعة إلا بعقد. أبلغ بمسار أو فئة آمنة دون أسرار. استخدم أداة مخطط معتمدة عند الملاءمة وافحص سلوكها وإصدارها بدل افتراض أن الأنواع المستنتجة تضمن كل قاعدة.
حفظ الصلاحية بعد الفحص
قد تبطل صلاحية الكائن المعدل عبر أسماء مشتركة. انتق الحقول أو انسخها أو غلف الانتقالات الحافظة. تفيد readonly دون تجميد مطلق، ويسهل المصنع الإنشاء المقصود وتظل المداخل غير المكتوبة محتاجة فحصًا. اختبر null والأوليات والمفقود والعدد والزائد والفراغ والأقصى. افصل اختبارات المحلل كي لا يجعل حارس كاذب بقية الاختبارات تبدو صحيحة. تُكتسب الثقة عند حد وتُحفظ بسياسة تعديل.
الأخطاء الشائعة وإصلاحها
محلل JSON عام يدعي فحص T.
- لماذا يحدث؟
- عومل معامل ممحو كمخطط تنفيذي.
- كيف تصلحه؟
- اقبل unknown ونفذ محللًا فعليًا.
- كيف تتجنب تكراره؟
- اختبر البنى الخاطئة لا الصياغة فقط.
عدد مفحوص يخالف المجال.
- لماذا يحدث؟
- كان typeof الفحص العددي الوحيد.
- كيف تصلحه؟
- افحص النهاية والصحيح الآمن والحدود.
- كيف تتجنب تكراره؟
- اكتب القواعد صراحة بجوار المخطط.
بيانات صحيحة تبطل بتعديل مشترك.
- لماذا يحدث؟
- لم يثبت الفحص سياسة ملكية أو تعديل.
- كيف تصلحه؟
- انسخ المنتقى أو غلف الانتقالات المدعومة.
- كيف تتجنب تكراره؟
- راجع التشارك بعد الفحص.
اختبر فهمك
1. صنّف decode(null) وdecode({count: 2.5}) وdecode({count: 0}) واشرح الفحوص.
اعرض الحل المشروح
تُرفض null قبل الخاصية ويفشل الكسر في Number.isSafeInteger ويُقبل الصفر لشموله. ترفض صدقية count الصفر خطأ. اختبرها متطلبات مستقلة كي لا يستبدلها اختصار خاطئ.
2. يقبل مدخل CountData صحيحة ويسمح بتغيير سجل مستخدم آخر. ما الحماية المفقودة دون any أو تأكيدات؟
اعرض الحل المشروح
تنقص صلاحية تربط الفاعل الموثق بالسجل. يثبت فحص البنية والعدد صحة البيانات فقط. افحص الإذن قبل الالتزام واختبر فاعلًا بلا وصول. لا يثبت نوع أعقد وحده صلاحية الطلب في السياق الفعلي.
أهم ما تعلمته
- تحتاج unknown دليلًا لا تأكيدًا.
- افحص البنية والمجال والموارد صراحة.
- الصلاحيات وثبات التعديل التزامان مستقلان.