TypeScript / المتقدم / الدرس 18
الأمان وحدود async ومشروع تقارير ختامي
اجمع البيانات المفحوصة والصلاحيات الصريحة ولقطات async الثابتة والناتج المنتقى دون اعتبار الأنواع آلية أمان.
في هذه الصفحة
أهداف الدرس
- فصل التحقق والصلاحيات وانتقاء الناتج.
- حفظ افتراضات الحالة عبر التعليق.
- دمج اختبار النوع والتنفيذ في مشروع قابل للمراجعة.
لا توثّق الأنواع هوية الطلب أو صلاحياته
لا توثق واجهة المستخدم هوية البايتات ولا تمنح بنية صحيحة إذن السجل. تحتاج قرارات الأمان دليل نظام الهوية والصلاحيات. افصل الفحص والإذن والانتقال وترميز الناتج. يساعد اتحاد العمليات الشيفرة المفحوصة ويحتاج النص الخارجي فحصًا وإذنًا. تستخدم الدروس بيانات محلية اصطناعية دون شبكة أو مسح أمني؛ فهي توضح العقد لا تصميم توثيق إنتاج كاملًا.
عرض readonly ليس لقطة تاريخية
قد تعلق async وتتغير الكائنات عبر أسماء أخرى. تقيد readonly المسار ولا تحفظ الماضي. ينسخ المثال الأعداد الأولية قبل await لوعد جاهز، ويلحق المستدعي عنصرًا بعد ذلك ويستخدم التقرير النسخة. هذه لقطة سطحية ويحتاج الداخل سياسة أخرى. لا إدخال خارجي أو وعد توقيت؛ توضح الجدولة عبور افتراضات التعديل للتعليق.
export {};
async function totalLater(values: readonly number[]): Promise<number> {
const snapshot = [...values];
await Promise.resolve();
return snapshot.reduce((sum, value) => sum + value, 0);
}
const source = [1, 2];
const result = totalLater(source);
source.push(100);
result.then(value => console.log(value));
3
تحوي اللقطة واحدًا واثنين ولا يغير تعديل المصدر المصفوفة المنسوخة للتقرير.
فحص الإذن وبناء الحقول العامة فقط
تستقبل الدالة فاعلًا أثبته المستدعي وتقارن الملكية وتبني سجلًا عامًا. لا يصبح رقم يقدمه العميل دليل هوية؛ اشتقه من حد التوثيق الموثوق فعلًا. يمنع بناء كائن عام تسلسل الرمز الداخلي عرضيًا، ولا تحذفه Omit من الأصل. اختبر الرفض والمفاتيح الفعلية لا التوقيع فقط.
export {};
type Actor = { id: number };
type Stored = { ownerId: number; title: string; internalToken: string };
function visible(actor: Actor, record: Stored): { title: string } | undefined {
if (actor.id !== record.ownerId) { return undefined; }
return { title: record.title };
}
const record: Stored = { ownerId: 1, title: "Draft", internalToken: "synthetic" };
console.log(JSON.stringify(visible({ id: 1 }, record)));
console.log(visible({ id: 2 }, record) === undefined);
{"title":"Draft"}
true
يتلقى الفاعل المطابق title فقط ويُرفض الآخر ولا يُنسخ الحقل الداخلي للناتج.
إظهار الفشل والإلغاء وحدود الموارد
يصف Promise<T> النجاح ولا يحدد الرفض والإلغاء وحد التوازي وإعادة المحاولة تلقائيًا. التقط unknown وافحص الخطأ المنظم. تثبت النسخة البيانات ولا تتراجع عن أثر خارجي إذا فشل لاحق. حدّد الالتزام والإلغاء وحدّ القوائم والمهام بدل عمل غير محدود. رمّز الناتج لوجهته؛ فالنص المحدد ليس تلقائيًا HTML أو SQL أو صدفة أو URL آمنًا.
تسليم نظام تقارير صغير محدد
ابنِ حزمة محلية بمحلل unknown ودوال مجال واتحاد نتيجة وخدمة تقرير وعرض منتقى. وائم الوحدات واختبر المدخل. غط الصياغة والبنية والحدود والغياب والإذن والفراغ والتعديل عبر await والمفاتيح. أضف رفضًا نوعيًا للعلامات والمفاتيح وقِس الكلفتين بعد الصحة. وثّق الإصدارات والحدود والفشل وافتراضات الخارج. يُفهم العقد الكامل دون ثقة بالتأكيدات أو قراءة كل سطر.
الأخطاء الشائعة وإصلاحها
الثقة بمعرّف فاعل محدد يأتي من العميل.
- لماذا يحدث؟
- خُلطت البنية بالهوية الموثقة.
- كيف تصلحه؟
- اشتق الهوية والإذن من الحد الموثوق.
- كيف تتجنب تكراره؟
- اختبر الفاعل المرفوض مع البنية الصحيحة.
إدخال async readonly يتغير قبل استخدامه.
- لماذا يحدث؟
- لم تلتقط المعلمة لقطة ثابتة.
- كيف تصلحه؟
- انسخ البيانات أو غلفها وفق العمر اللازم.
- كيف تتجنب تكراره؟
- راجع الأسماء المشتركة عبر كل تعليق.
إدراج نص محدد النوع في سياق غير آمن.
- لماذا يحدث؟
- خُلط النوع بترميز سياقي آمن.
- كيف تصلحه؟
- استخدم ترميز الوجهة أو معاملاتها الآمنة المدعومة.
- كيف تتجنب تكراره؟
- افصل التحقق ومعالجة الناتج.
اختبر فهمك
1. احذف النسخة واقرأ values بعد await. ما ناتج المثال وما العقد المتغير؟
اعرض الحل المشروح
سيشمل المئة الملحقة ويعطي مئة وثلاثة. سيرى الحالة المشتركة اللاحقة بدل وقت الاستدعاء. قد يُقصد أيهما ولا تختار readonly بينهما. احفظ اختبار العقد الزمني خاصة للداخل المعدل بدل الأوليات.
2. يستبدل مطور الكائن المنتقى بقيمة Stored مسندة لواجهة title فقط. اشرح خطر الكشف واختباره.
اعرض الحل المشروح
يبقى internalToken في الكائن وقد يكشفه التسلسل رغم العرض الضيق. احفظ الانتقاء وافحص أن title المفتاح الوحيد واختبر رفض غير المسموح. لا يثبت الإسناد حذف البيانات أو إذن كشفها.
أهم ما تعلمته
- تساعد الأنواع التفكير ولا تفرض الهوية أو الترميز.
- ثبّت البيانات عمدًا عبر async.
- اختبر الرفض والناتج المتسلسل الفعلي.