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