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

satisfies เทียบกับคำอธิบายชนิดข้อมูล

คงการอนุมานค่าคงที่ไว้ พร้อมตรวจสอบโครงสร้างไปด้วย

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

รูปแบบการระบุชนิด

รูปแบบคลาสสิก const config: Type = {...} จะตรวจสอบออบเจกต์ แต่ชนิดของตัวแปรจะกลายเป็น Type ทำให้ค่าลิเทอรัลภายในถูกขยายชนิด

type Config = { mode: string; level: number };
const config: Config = { mode: "dark", level: 5 };
// config.mode has type string
console.log(config.mode);

ลักษณะของการขยายชนิด

เมื่อใช้การระบุชนิด config.mode จะเป็น string คุณไม่สามารถกำหนดค่าให้ตัวแปรที่คาดหวังลิเทอรัล "dark" ได้

type Config = { mode: string };
const config: Config = { mode: "dark" };
// const m: "dark" = config.mode; // Error: string not assignable to "dark"
console.log(config.mode);

รูปแบบ satisfies

เมื่อใช้ const config = {...} satisfies Type ตัวแปรจะคงชนิดที่อนุมานได้แบบ ตรงตามจริงไว้ พร้อมทั้งยังได้รับการตรวจสอบเทียบกับ Type

type Config = { mode: string; level: number };
const config = { mode: "dark", level: 5 } satisfies Config;
// config.mode has type "dark"
console.log(config.mode);

การอนุมานที่ตรงตามจริงยังคงอยู่

ตอนนี้ config.mode เป็นลิเทอรัล "dark" จึงใช้ได้ในทุกตำแหน่งที่ต้องการชนิดแบบแคบ

type Config = { mode: string };
const config = { mode: "dark" } satisfies Config;
const m: "dark" = config.mode; // OK
console.log(m);

ทั้งสองแบบยังคงตรวจสอบความถูกต้อง

ทั้งสองรูปแบบจะปฏิเสธออบเจกต์ที่ไม่ถูกต้อง ความแตกต่างอยู่ที่ชนิดของตัวแปรผลลัพธ์เท่านั้น ไม่ได้อยู่ที่ว่าจะมีการตรวจสอบความถูกต้องหรือไม่

type Config = { level: number };
// const a: Config = { level: "x" }; // Error
// const b = { level: "x" } satisfies Config; // Error
const ok = { level: 3 } satisfies Config;
console.log(ok.level);

ตรวจพบพร็อพเพอร์ตีส่วนเกิน

เช่นเดียวกับการระบุชนิด satisfies จะทำเครื่องหมายพร็อพเพอร์ตีส่วนเกินที่ไม่มีอยู่ในชนิดเป้าหมาย ซึ่งช่วยตรวจจับคำสะกดผิดในคีย์

type Config = { mode: string };
// const c = { mode: "dark", extar: true } satisfies Config; // Error: extar
const c = { mode: "dark" } satisfies Config;
console.log(c.mode);

รักษาความเป็นทูเพิล

satisfies ยังช่วยให้อาร์เรย์คงความแม่นยำแบบทูเพิลไว้ได้เมื่อใช้ร่วมกับ as const พร้อมทั้งยังตรวจสอบชนิดของสมาชิก

type Nums = readonly number[];
const xs = [1, 2, 3] as const satisfies Nums;
// xs is a readonly tuple [1, 2, 3], validated as numbers
console.log(xs.length);

การระบุชนิดขยายสมาชิกของยูเนียน

หากฟิลด์เป็นยูเนียนอย่าง "a" | "b" การระบุชนิดเป็นยูเนียนจะคงค่าไว้เป็นยูเนียน แต่ชนิดฟิลด์ที่กว้างกว่าจะทำให้ค่าถูกขยายชนิด ส่วน satisfies จะตรึงสมาชิกที่ตรงตามจริงไว้

type Config = { tier: string };
const withAnn: Config = { tier: "pro" };       // tier: string
const withSat = { tier: "pro" } satisfies Config; // tier: "pro"
console.log(withAnn.tier, withSat.tier);

คงการเติมข้อความอัตโนมัติขณะอ่านค่า

เนื่องจาก satisfies รักษาคีย์และค่าลิเทอรัลไว้ โปรแกรมแก้ไขจึงสามารถเติมข้อความอัตโนมัติตามออบเจกต์ที่ตรงตามจริงได้ ไม่ใช่ตามชนิดที่ประกาศไว้ซึ่งกว้างกว่า

type Theme = Record<string, string>;
const theme = { bg: "black", fg: "white" } satisfies Theme;
// theme.<autocomplete shows bg and fg>
console.log(theme.bg, theme.fg);

การเลือกระหว่างสองรูปแบบ

ใช้การระบุชนิดแบบปกติเมื่อคุณต้องการชนิดที่กว้างกว่าอย่างแท้จริง ใช้ satisfies เมื่อคุณต้องการการตรวจสอบความถูกต้อง แต่ยังต้องใช้โครงสร้างที่อนุมานได้อย่างแม่นยำในภายหลัง

type Config = { mode: string };
// Want wide type for reassignment flexibility -> annotation
let a: Config = { mode: "dark" };
// Want exact literals for later indexing -> satisfies
const b = { mode: "dark" } satisfies Config;
console.log(a.mode, b.mode);

สรุปเปรียบเทียบแบบเคียงข้างกัน

การระบุชนิดจะขยายชนิด ส่วน satisfies จะรักษาความแม่นยำไว้ ทั้งสองแบบตรวจสอบความถูกต้อง สำหรับ config ที่ไม่เปลี่ยนแปลงและมีไว้ให้อ่าน โดยทั่วไป satisfies เป็นค่าเริ่มต้นที่ดีกว่า

type C = { color: string; size: number };
const widened: C = { color: "red", size: 1 };
const exact = { color: "red", size: 1 } satisfies C;
console.log(widened.color, exact.color);

ตรวจสอบความเข้าใจอย่างรวดเร็ว: satisfies กับการระบุชนิด

ทดสอบความเข้าใจของคุณเกี่ยวกับความแตกต่างนี้

ทบทวน: satisfies กับการระบุชนิด

การระบุชนิดจะตรวจสอบความถูกต้อง แต่ขยายค่าลิเทอรัลให้เป็นชนิดพื้นฐานของค่าเหล่านั้น โอเปอเรเตอร์ satisfies จะตรวจสอบความถูกต้องและคงการอนุมานที่ตรงตามจริงไว้ ทั้งค่าลิเทอรัล คีย์ และความแม่นยำของทูเพิลจึงยังคงอยู่

type C = { mode: string };
const c = { mode: "dark" } satisfies C;
const exact: "dark" = c.mode;
console.log(exact);

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

บทเรียน “satisfies เทียบกับคำอธิบายชนิดข้อมูล” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “satisfies เทียบกับคำอธิบายชนิดข้อมูล”

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

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

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

บทเรียน “satisfies เทียบกับคำอธิบายชนิดข้อมูล” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เหตุใดจึงมี satisfies
  2. satisfies เทียบกับคำอธิบายชนิดข้อมูล
  3. satisfies เทียบกับการยืนยันด้วย as
  4. รูปแบบการใช้ satisfies ในทางปฏิบัติ
← กลับไปที่ TypeScript Academy