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