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

การจัดการข้อผิดพลาดแบบครอบคลุมด้วยยูเนียนที่จำแนกประเภท

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

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

บทนำ

เป้าหมาย: รับประกันว่าสมาชิกทุกตัวของยูเนียนได้รับการจัดการ คุณจะใช้ switch + never ยูทิลิตี exhaustiveCheck ขนาดเล็ก และเรียนรู้วิธีรักษาความครอบคลุมข้ามไฟล์

  • ตัวจำแนก (ฟิลด์ tag)
  • คำสั่ง switch ที่ครอบคลุมทุกกรณี
  • ค่าเริ่มต้นที่ล้มเหลวทันที

ยูเนียนแบบแยกประเภท

ยูเนียนแบบแยกประเภทมีแท็กร่วมกัน (ในที่นี้คือ kind) แต่ละรูปแบบจะเก็บข้อมูลของตนเอง

export type Payment =
  | { kind: "Card"; last4: string }
  | { kind: "Cash" }
  | { kind: "Wire"; iban: string }

Switch และ never

default กำหนดค่า p ให้เป็น never หากภายหลังคุณเพิ่มรูปแบบใหม่ คอมไพเลอร์จะแจ้งข้อผิดพลาดจนกว่าคุณจะจัดการรูปแบบนั้น

export function describe(p: Payment): string {
  switch (p.kind) {
    case "Card": return `Card ••••${p.last4}`
    case "Cash": return "Cash"
    case "Wire": return `Wire ${p.iban}`
    default: {
      const _exhaustive: never = p
      return _exhaustive
    }
  }
}

ตัวช่วย exhaustiveCheck

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

export function exhaustiveCheck(x: never): never {
  throw new Error(`Unhandled case: ${JSON.stringify(x)}`)
}

export function pay(p: Payment): string {
  switch (p.kind) {
    case "Card": return "charged card"
    case "Cash": return "took cash"
    case "Wire": return "initiated wire"
    default: return exhaustiveCheck(p)
  }
}

ความครอบคลุมข้ามโมดูล

เมื่อกำหนดยูเนียนไว้ในไฟล์หนึ่งและจัดการในอีกไฟล์หนึ่ง การเพิ่มแขนงใหม่จะยังทำให้การสร้างล้มเหลวจนกว่าจะอัปเดตคำสั่ง switch ทั้งหมด ซึ่งเป็นสิ่งที่เราต้องการอย่างแท้จริง

// errors.ts
export type AppError =
  | { tag: "Auth"; reason: "Unauthorized" | "Forbidden" }
  | { tag: "NotFound"; resource: string }
  | { tag: "Conflict"; resource: string }

// handler.ts
import type { AppError } from "./errors"
import { exhaustiveCheck } from "./exhaustive"

export function toStatus(e: AppError): number {
  switch (e.tag) {
    case "Auth": return e.reason === "Unauthorized" ? 401 : 403
    case "NotFound": return 404
    case "Conflict": return 409
    default: return exhaustiveCheck(e)
  }
}

เคล็ดลับและข้อควรระวัง

เคล็ดลับ:

  • ควรใช้แท็กแบบ ลิเทอรัลสตริง (เช่น tag/kind)
  • ทำให้แต่ละรูปแบบมีขนาดเล็ก ประกอบข้อมูลผ่านออบเจ็กต์ซ้อนกันแทนการสร้างยูเนียนขนาดใหญ่
  • อย่าใช้ default โดยไม่มีตัวป้องกัน never เพราะจะซ่อนกรณีที่ขาดหายไป

การตรวจสอบความครบถ้วน

ตรวจสอบอย่างรวดเร็ว: อะไรเป็นตัวบังคับให้จัดการครบทุกกรณี

สรุปทบทวน

สรุปทบทวน: ใช้ตัวจำแนก เขียนคำสั่ง switch และในแขนง default ให้กำหนดค่าเป็น never (หรือเรียกใช้ exhaustiveCheck) เพื่อรับประกันความครอบคลุมทั้งหมดเมื่อยูเนียนเปลี่ยนแปลง

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

บทเรียน “การจัดการข้อผิดพลาดแบบครอบคลุมด้วยยูเนียนที่จำแนกประเภท” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดแบบครอบคลุมด้วยยูเนียนที่จำแนกประเภท”

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

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

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

บทเรียน “การจัดการข้อผิดพลาดแบบครอบคลุมด้วยยูเนียนที่จำแนกประเภท” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ชนิดแบบ Result/Either
  2. การจัดการข้อผิดพลาดแบบครอบคลุมด้วยยูเนียนที่จำแนกประเภท
← กลับไปที่ TypeScript Academy