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