0Pricing
TypeScript Academy · درس

استنتاج أشكال نتائج الاستعلام

دعوا منشئ الاستعلام يستنتج نوع الصف المُعاد

استنتاج أشكال نتائج الاستعلام درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

يتبع نوع النتيجة عملية الاختيار

لا يكتفي منشئ الاستعلام الجيد بالتحقق من المدخلات، بل يستنتج الشكل الدقيق لكل صف نتيجة من الأعمدة التي اخترتموها. اختاروا أعمدة أقل، وسيصبح نوع النتيجة أضيق.

اختيار الصف الكامل

يؤدي استدعاء select() من دون إسقاط إلى إرجاع نوع الصف بأكمله.

const rows = await db.select().from(users);
// rows: { id: number; name: string; age: number | null; isAdmin: boolean }[]

الاختيار الجزئي يضيّق النوع

اختاروا الأعمدة التي تحتاجون إليها فقط، وسيحتوي نوع النتيجة على هذه المفاتيح وحدها.

const rows = await db
  .select({ id: users.id, name: users.name })
  .from(users);
// rows: { id: number; name: string }[]
// Accessing rows[0].age is a compile error.

إعادة تسمية الأعمدة في النتيجة

تصبح مفاتيح كائن الاختيار مفاتيح النتيجة، ولذلك يمكنكم إعادة التسمية بحرية، وسيعكس النوع الأسماء الجديدة.

const rows = await db
  .select({ userId: users.id, fullName: users.name })
  .from(users);
// rows: { userId: number; fullName: string }[]

الأعمدة المحسوبة والمجمّعة

تحمل عمليات التجميع نوعها المستنتج الخاص. وتنتج count() رقمًا، بينما يسمّي مفتاح الاسم المستعار هذه القيمة في النتيجة.

import { count } from "drizzle-orm";

const rows = await db
  .select({ total: count() })
  .from(users);
// rows: { total: number }[]

تنتقل القابلية لـ null عبر النتيجة

إذا اخترتم عمودًا يقبل null، فستُحفظ هذه القابلية في النتيجة. ويظل اختيار age محتفظًا بالنوع number | null.

const rows = await db.select({ age: users.age }).from(users);
// rows: { age: number | null }[]

كيفية بناء الاستنتاج

نوع النتيجة هو نوع معيّن فوق كائن الاختيار: كل قيمة هي عمود يُقرأ نوع data الخاص به، إلى جانب قابلية null، ويُسند ذلك إلى المفتاح المقابل.

type InferSelect<S> = {
  [K in keyof S]: S[K] extends Column<infer D, infer Null>
    ? Null extends true ? D | null : D
    : never;
};

مساعدات الصف الواحد

توفر بعض المنشئات وصولًا باستخدام .get() أو [0]. ويظل نوع العنصر مشتقًا من الاختيار نفسه، لكنه يُستخرج من المصفوفة.

const one = (await db.select({ id: users.id }).from(users))[0];
// one: { id: number } | undefined

توسّع عمليات الربط الشكل

عند إجراء ربط، يكتسب نوع النتيجة مفاتيح من الجدول المرتبط. وتظل الاختيارات الجزئية عبر الجداول المرتبطة تضيق بدقة. (لعمليات الربط درس مستقل.)

const rows = await db
  .select({ name: users.name, title: posts.title })
  .from(users)
  .innerJoin(posts, eq(posts.authorId, users.id));
// rows: { name: string; title: string }[]

لماذا يهم التضييق

يمنع إرجاع المفاتيح التي اخترتموها فقط الاعتماد غير المقصود على أعمدة لم تجلبوها. ويعكس النوع SQL الفعلي، لذلك تظهر أخطاء جلب بيانات أكثر أو أقل من اللازم في المحرر.

مأزق: التوسيع ثم الانتقاء

إذا جلبتم الصف الكامل ثم انتقيتم المفاتيح يدويًا في JS، فستخسرون فائدة التضييق على مستوى قاعدة البيانات، وسترسلون أعمدة إضافية عبر الشبكة. ويُفضّل إجراء التضييق في الاستعلام.

تحقق سريع

تأكدوا من فهمكم للأشكال المستنتجة للنتائج.

مراجعة

يُحسب نوع النتيجة من عملية الاختيار عبر نوع معيّن: فالاختيارات الكاملة تُرجع الصف بأكمله، والاختيارات الجزئية تضيّق النتيجة إلى المفاتيح المحددة، وتغيّر إعادة التسمية مفاتيح النتيجة، وتنتقل القابلية لـ null عبرها، وتحمل عمليات التجميع أنواعها الخاصة. ويعكس النوع الثابت دائمًا SQL الذي كتبتموه فعليًا.

الأسئلة الشائعة

هل درس «استنتاج أشكال نتائج الاستعلام» مجاني؟

نعم — نص درس «استنتاج أشكال نتائج الاستعلام» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «استنتاج أشكال نتائج الاستعلام»؟

دعوا منشئ الاستعلام يستنتج نوع الصف المُعاد تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «استنتاج أشكال نتائج الاستعلام»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعيين المخطط إلى النوع
  2. إنشاء الاستعلامات الآمن نوعيًا
  3. استنتاج أشكال نتائج الاستعلام
  4. العلاقات وعمليات الربط مع الأنواع
← العودة إلى TypeScript Academy