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

สวิตช์ที่ครอบคลุมทุกกรณีและการตรวจสอบ never

เขียนยูเนียนที่ครอบคลุมทุกกรณีด้วย switch และตรวจจับกรณีที่ขาดหายด้วย never พร้อมสร้างตัวช่วย assertNever ที่ปลอดภัย

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

บทนำ

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

คำสั่งแยกกรณีแบบครบทุกกรณี

ยูเนียนแบบแยกแยะใช้ฟิลด์ ชนิดร่วมกัน คำสั่งแยกกรณีที่ใช้ฟิลด์นั้นจะจำกัดชนิดของแต่ละกรณีได้อย่างปลอดภัย

type Circle = { kind: "circle"; radius: number }
type Square = { kind: "square"; size: number }
type Shape = Circle | Square

function area(s: Shape): number {
  switch (s.kind) {
    case "circle":
      return Math.PI * s.radius * s.radius
    case "square":
      return s.size * s.size
  }
}

เมื่อยูเนียนมีสมาชิกเพิ่มขึ้น

เมื่อเพิ่มสมาชิกใหม่ (เช่น สามเหลี่ยม) เราจะตรวจจับได้ด้วยชนิดที่เป็นไปไม่ได้ เพื่อไม่ให้กรณีที่ข้ามไปสร้างข้อบกพร่องโดยไม่รู้ตัว

type Triangle = { kind: "triangle"; base: number; height: number }
// If we extend Shape but forget to add case, we want a compile-time error
// type Shape = Circle | Square | Triangle

assertNever

พารามิเตอร์ของ assertNever ต้องมีชนิดที่เป็นไปไม่ได้ ดังนั้นหากรูปแบบใหม่ตกไปอยู่ในกรณีเริ่มต้น จะทำให้เกิดข้อผิดพลาดระหว่างคอมไพล์

function assertNever(x: never): never {
  throw new Error(`Unhandled case: ${String(x)}`)
}

function areaSafe(s: Shape): number {
  switch (s.kind) {
    case "circle":
      return Math.PI * s.radius * s.radius
    case "square":
      return s.size * s.size
    default:
      return assertNever(s) // if Shape grows, compiler errors here
  }
}

ยูเนียนแบบลิเทอรัล

รูปแบบเดียวกันนี้ใช้กับยูเนียนของลิเทอรัลสตริงได้เช่นกัน ให้ครอบคลุมค่าที่เป็นไปได้ทุกค่า และเรียกใช้ assertNever ในกรณีเริ่มต้น

type Status = "idle" | "loading" | "success" | "error"

function toIcon(s: Status) {
  switch (s) {
    case "idle": return "⏸"
    case "loading": return "⏳"
    case "success": return "✅"
    case "error": return "⚠️"
    default: return assertNever(s)
  }
}

// Alternative: const check
const _check: never = ((): Status => "idle")() as never // force compile-time check with care

เคล็ดลับ

เคล็ดลับ: เปิดใช้ noFallthroughCasesInSwitch เลือกใช้ยูเนียนแบบแยกแยะ และใช้กรณีเริ่มต้นสำหรับ assertNever เท่านั้น

// Tips
// - Enable noFallthroughCasesInSwitch in tsconfig for safer switches
// - Prefer discriminated unions over boolean flags
// - Keep default branch only to call assertNever; avoid swallowing cases

การตรวจสอบ assertNever

ตรวจสอบอย่างรวดเร็ว: assertNever มีจุดประสงค์อะไรในคำสั่งแยกกรณีแบบครบทุกกรณี

สรุปทบทวน

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

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

บทเรียน “สวิตช์ที่ครอบคลุมทุกกรณีและการตรวจสอบ never” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “สวิตช์ที่ครอบคลุมทุกกรณีและการตรวจสอบ never”

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

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

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

บทเรียน “สวิตช์ที่ครอบคลุมทุกกรณีและการตรวจสอบ never” ใช้เวลานานแค่ไหน

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

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

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

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

  1. สวิตช์ที่ครอบคลุมทุกกรณีและการตรวจสอบ never
  2. ฟังก์ชันเพรดิเคตและตัวดำเนินการ satisfies
  3. ปรับปรุงยูเนียนข้ามขอบเขตฟังก์ชัน
← กลับไปที่ TypeScript Academy