محتويات الدورة

Vue / المتقدم: المعمارية والاستيعاب ودليل الإنتاج / الدرس 13

العقود التفاعلية ذات الأنواع وحدود الاعتماد

استخدم TypeScript والواجهات التفاعلية لتوثيق الملكية دون اعتبار النوع الساكن تحققاً وقت التشغيل.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • عرّف خصائص وأحداثاً ذات أنواع بالمترجم المدعوم.
  • ميّز القراءة فقط وفك المرجع والسياق المحقون.

افصل الوعد الساكن عن البيانات الواردة

تصف TypeScript المدخل والحدث والمرجع والخدمة قبل التشغيل ولا تتحقق من JSON لمجرد إسناده لواجهة. تحقق عند الحد الموثوق وحوله لعقد المجال. تمنع readonly الساكنة كتابة أثناء التطوير ولا تجمد كل كائن، ولغلاف Vue سلوك تشغيل مستقل. حدد دور كل طبقة ولا تسم المكوّن آمناً تلقائياً لنوعه.

اجعل شكل واجهة المكوّن صريحاً

يستخدم SFC خصائص نوعية وأحداث tuple مدعومة في 3.5. يتلقى ملاحظة ويقترح اختيار id ويبقى القرار والمصدر للأب. تصف Readonly استخدامه لا تفويضاً. لاستنتاج التشغيل حدود مترجم خصوصاً للأنواع المعقدة؛ استخدم الأدوات وvue-tsc المناسب لا فحص JavaScript العادي لهذه التصريحات.

vue عقد اختيار ذو أنواع
<script setup lang="ts">
type Note = { id: string; title: string }
const props = defineProps<{ note: Readonly<Note> }>()
const emit = defineEmits<{ select: [id: string] }>()
function select() { emit("select", props.note.id) }
</script>

<template>
  <button type="button" @click="select">{{ props.note.title }}</button>
</template>

يتطلب مترجم SFC وأدوات TypeScript المتوافقة. حمولة الحدث id المعطى. لم ينفذ مترجم TypeScript أو تشغيل Vue ولا يدعي تحقق البيانات البعيدة.

افهم وصول المرجع الخاص بالمجموعات

لا يفك القالب كل مرجع بكل بنية؛ للمصفوفة والمجموعة الأصلية حدود. يحفظ المثال .value لمرجع المصفوفة وMap. ميّز وسيط المجموعة وعنصر المرجع وبدائيه، ولا يصبح البدائي الممرر حياً دون مصدر آخر. تجنب تعشيقاً يخفي الملكية وقد يكون النموذج الأبسط أوضح من سلسلة تحويل ضمني.

javascript وصول صريح للمراجع داخل مجموعات تفاعلية
import { reactive, ref } from "vue"

const entries = reactive([ref("n1")])
const lookup = reactive(new Map([["selected", ref("n2")]]))
const firstId = entries[0].value
const selectedId = lookup.get("selected").value
if (firstId !== "n1" || selectedId !== "n2") {
  throw new Error("COLLECTION_REF_MISMATCH")
}

يتطلب Vue ويشرح السلوك الموثق. ينجح التحقق المقصود وفق العقد لكن المقتطف لم ينفذ ولا يربط أو يعرض مكوّناً.

اكشف سلطة التعديل بقصد

يساعد منظر readonly على حصر التعديل بعمليات مع إتاحة المراقبة، ولا يمنع المالك من تحديث الأصل أو يؤمن الخادم. حدد المرجع وقراءته وسطحيته وثباته ووثقه. تترك السطحية الداخل بلا تحويل فيفاجئ التعديل. راجع الهوية مع المكتبات وحد raw لسبب واضح. تصف الأنواع العقد لا تخفيه بتحويل واسع.

استخدم السياق المحقون اعتماداً صريحاً

يمرر provide/inject قدرة دون كل وسيط، فاستخدم مفتاحاً ثابتاً ورمزاً نوعياً عند الملاءمة وحدد الغياب. أبقِ التعديل قرب المزود أو بأفعال لا عبث مستهلك. يتبع الحقن شجرة الملكية وليس عاماً تلقائياً وتحتاج طلبات SSR سياقات مستقلة. وفر المزود بالاختبار وافحص الغياب؛ يصعب فهم اعتماد خفي مقارنة بخدمة محقونة ضيقة موثقة.

الأخطاء الشائعة وإصلاحها

يعتبر تأكيد النوع تحقق استجابة

لماذا يحدث؟
اختلط الساكن بدليل التشغيل.
كيف تصلحه؟
تحقق من غير الموثوق قبل قيمة المجال.
كيف تتجنب تكراره؟
اجعل حدود التحليل والنوع صريحة.

يقرأ مرجع Map كبدائي

لماذا يحدث؟
عُمم فك القالب على المجموعة.
كيف تصلحه؟
استخدم الوصول الصريح الموثق.
كيف تتجنب تكراره؟
اختبر البنية والعقد الفعليين.

يسبب غياب المزود تعطلًا بعيداً

لماذا يحدث؟
لم يوثق مطلب السياق.
كيف تصلحه؟
عالج الغياب عند حد الاعتماد.
كيف تتجنب تكراره؟
اختبر حضور المزود وملكيته.

اختبر فهمك

1. هل تثبت Readonly<Note> تفويض استجابة الخادم؟

اعرض الحل المشروح

لا؛ تصف الاستخدام الساكن وتبقى المصادقة على البيانات والتفويض منفصلين. يستقبل المكوّن القيمة بعد إثبات الحد الحقائق اللازمة.

2. يعيد composable حالة سطحية ويعدل المستهلك الداخل. لماذا المفاجأة؟

اعرض الحل المشروح

لا تتتبع السطحية كل تعديل داخلي كالعميقة. وثق الاستبدال الثابت أو عقد تحديث واضحاً وتحقق من قراءة المصدر المحفز فعلياً.

أهم ما تعلمته

  • تقدم الأنواع والقراءة والتحقق ضمانات مختلفة.
  • تقرأ قواعد المجموعات في سياقها.
  • للقدرة المحقونة ملكية ومعالجة غياب.

المراجع الرسمية