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

ตรวจสอบความครอบคลุมทุกกรณีด้วย never

ใช้ never เพื่อให้แน่ใจว่าจัดการทุกกรณีของยูเนียนแล้ว

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

ยินดีต้อนรับ

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

ปัญหาการตรวจสอบความครบถ้วน

เมื่อใช้ switch กับประเภทยูเนียนแล้วลืมจัดการกรณีใด JavaScript จะทำงานต่อไปอย่างเงียบ ๆ TypeScript ตรวจจับปัญหานี้ได้ด้วยการตรวจสอบ never
type Shape = 'circle' | 'square';
function area(s: Shape): number {
  if (s === 'circle') return 3.14;
  if (s === 'square') return 1;
  // What if we add 'triangle'?
}

รูปแบบตรวจสอบความครบถ้วนด้วยชนิดที่เป็นไปไม่ได้

กำหนดค่าที่เหลือให้เป็นชนิดที่เป็นไปไม่ได้ หาก TypeScript อนุมานชนิดที่ไม่ใช่ชนิดที่เป็นไปไม่ได้ แสดงว่ายังมีกรณีที่ไม่ได้จัดการ
function assertNever(x: never): never {
  throw new Error('Unexpected value: ' + x);
}
function area(s: Shape): number {
  switch (s) {
    case 'circle': return 3.14;
    case 'square': return 1;
    default: return assertNever(s);
  }
}

การเพิ่มสมาชิกชนิดยูเนียนใหม่

หากเพิ่ม 'สามเหลี่ยม' ลงในยูเนียนของรูปทรง TypeScript จะแจ้งข้อผิดพลาดที่ `assertNever(s)` เพื่อบอกให้คุณจัดการกรณีใหม่นี้
type Shape = 'circle' | 'square' | 'triangle';
// Now TypeScript errors on assertNever(s) because s is 'triangle'
// — it's not never!

การตรวจสอบชนิดที่เป็นไปไม่ได้แบบแทรกในบรรทัด

คุณสามารถตรวจสอบความครบถ้วนแบบแทรกในบรรทัดได้โดยไม่ต้องใช้ฟังก์ชันตัวช่วย
function handle(shape: Shape): string {
  switch (shape.kind) {
    case 'circle': return 'circle';
    case 'square': return 'square';
    default:
      const _: never = shape; // Error if not exhaustive
      throw new Error('Unknown shape');
  }
}

การตรวจสอบความครบถ้วนโดยไม่ใช้คำสั่งสลับกรณี

ใช้เทคนิคเดียวกันในสายเงื่อนไข if/else
function process(action: Action): void {
  if (action.type === 'A') { /* ... */ }
  else if (action.type === 'B') { /* ... */ }
  else {
    const _: never = action; // exhaustive
  }
}

ชนิดที่เป็นไปไม่ได้ในข้อจำกัดชนิดทั่วไป

ชนิดที่เป็นไปไม่ได้คือชนิดล่างสุด และมีประโยชน์ในชนิดแบบมีเงื่อนไขเพื่อแทนแขนงที่เป็นไปไม่ได้
type NonNullable<T> = T extends null | undefined ? never : T;
// Removes null and undefined from T

การใช้ชนิดที่เป็นไปไม่ได้แทนสถานะที่เป็นไปไม่ได้

ชนิดที่เป็นไปไม่ได้มีประโยชน์สำหรับสร้างแบบจำลองสถานะที่ควรเป็นไปไม่ได้ในระบบชนิดของคุณ
type State<T> =
  | { kind: 'loading' }
  | { kind: 'success'; data: T }
  | { kind: 'error'; msg: string };
// There should never be a state with kind: 'unknown'

ชนิดที่เป็นไปไม่ได้ในชนิดแบบมีเงื่อนไข

ชนิดที่เป็นไปไม่ได้ใช้ในชนิดแบบมีเงื่อนไขเพื่อกรองสมาชิกชนิดที่ไม่ต้องการออก
type NonFunctions<T> = {
  [K in keyof T]: T[K] extends Function ? never : K
}[keyof T];
// Returns keys whose values are not functions

ชนิดที่เป็นไปไม่ได้ส่งต่อผ่านยูเนียน

ชนิดที่เป็นไปไม่ได้เป็นสมาชิกเอกลักษณ์ของชนิดยูเนียน — T | never = T
type T = string | never; // string
type U = never | number | never; // number

ตัวช่วย assertNever

ยูทิลิตี assertNever แบบง่ายเป็นสิ่งที่ทุกโครงการ TypeScript ควรมีไว้สำหรับตรวจสอบความครบถ้วน
function assertNever(value: never, message?: string): never {
  throw new Error(message ?? `Unhandled: ${JSON.stringify(value)}`);
}

ตรวจสอบอย่างรวดเร็ว

จะเกิดอะไรขึ้นที่บรรทัด `default: assertNever(s)` หาก `s` ยังคงมีชนิดที่เป็นไปได้ซึ่งไม่ได้จัดการ

สรุปทบทวน

ใช้ assertNever(x: never) ในกรณี default ของคำสั่ง switch เพื่อให้เกิดข้อผิดพลาดขณะคอมไพล์เมื่อยังไม่ได้จัดการสมาชิกของยูเนียน วิธีนี้ช่วยให้โค้ดยังคงถูกต้องเมื่อยูเนียนเติบโตขึ้นตามเวลา

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

บทเรียน “ตรวจสอบความครอบคลุมทุกกรณีด้วย never” ฟรีหรือไม่

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

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

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

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

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

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

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

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

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

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

  1. การทำชนิดให้แคบลงด้วย typeof และค่าความจริง
  2. การทำชนิดให้แคบลงด้วย instanceof และ in
  3. ฟังก์ชันตรวจสอบชนิดที่ผู้ใช้กำหนด
  4. ตรวจสอบความครอบคลุมทุกกรณีด้วย never
← กลับไปที่ TypeScript Academy