0Pricing
TypeScript Academy · บทเรียน

การอนุมานโครงสร้างผลลัพธ์การสืบค้น

ให้ตัวสร้างการสืบค้นอนุมานชนิดข้อมูลของแถวที่ส่งกลับ

การอนุมานโครงสร้างผลลัพธ์การสืบค้น เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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.

การเปลี่ยนชื่อคอลัมน์ในผลลัพธ์

คีย์ของออบเจ็กต์ select จะกลายเป็นคีย์ของผลลัพธ์ ดังนั้นคุณจึงเปลี่ยนชื่อได้อย่างอิสระ และชนิดข้อมูลจะสะท้อนชื่อใหม่

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 }[]

ความเป็นค่าว่างถูกส่งต่อไป

หากคุณเลือกคอลัมน์ที่เป็นค่าว่างได้ ความเป็นค่าว่างนั้นจะยังคงอยู่ในผลลัพธ์ การเลือก age จะคงชนิด number | null ไว้

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

การสร้างการอนุมานทำงานอย่างไร

ชนิดผลลัพธ์เป็นชนิดแบบแมปบนออบเจ็กต์ select ค่าภายในแต่ละค่าคือคอลัมน์ ซึ่งชนิด data และความเป็นค่าว่างจะถูกอ่านออกมาใส่ในคีย์ที่สอดคล้องกัน

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 คุณจะสูญเสียประโยชน์จากการทำให้ชนิดแคบลงในระดับฐานข้อมูล และส่งคอลัมน์ส่วนเกินผ่านเครือข่าย ควรทำให้ชนิดแคบลงตั้งแต่ในคิวรี

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ยืนยันความเข้าใจของคุณเกี่ยวกับรูปร่างผลลัพธ์ที่อนุมาน

สรุป

ชนิดผลลัพธ์ถูก คำนวณจากสิ่งที่เลือก ผ่านชนิดแบบแมป การเลือกทั้งแถวจะคืนทั้งแถว การเลือกบางส่วนจะทำให้เหลือเฉพาะคีย์ที่เลือก การเปลี่ยนชื่อจะเปลี่ยนคีย์ผลลัพธ์ ความเป็นค่าว่างจะถูกส่งต่อ และฟังก์ชันรวมจะมีชนิดของตัวเอง ชนิดข้อมูลแบบสถิติจะแสดง SQL ที่คุณเขียนจริงอยู่เสมอ

คำถามที่พบบ่อย

บทเรียน “การอนุมานโครงสร้างผลลัพธ์การสืบค้น” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การอนุมานโครงสร้างผลลัพธ์การสืบค้น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การอนุมานโครงสร้างผลลัพธ์การสืบค้น”

ให้ตัวสร้างการสืบค้นอนุมานชนิดข้อมูลของแถวที่ส่งกลับ คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การอนุมานโครงสร้างผลลัพธ์การสืบค้น” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม

ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแมปจากสคีมาเป็นชนิดข้อมูล
  2. การสร้างการสืบค้นที่ปลอดภัยด้านชนิดข้อมูล
  3. การอนุมานโครงสร้างผลลัพธ์การสืบค้น
  4. ความสัมพันธ์และการรวมตารางด้วยชนิดข้อมูล
← กลับไปที่ TypeScript Academy