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

การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก

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

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

การทำให้ชนิดข้อมูลแคบลงคืออะไร

TypeScript เริ่มต้นด้วยชนิดข้อมูลแบบกว้าง เช่น string | number การทำให้ชนิดข้อมูลแคบลงคือกระบวนการปรับชนิดข้อมูลให้เฉพาะเจาะจงมากขึ้นภายในบล็อกเงื่อนไข TypeScript จะติดตามการทำให้ชนิดข้อมูลแคบลงโดยอัตโนมัติ

การทำให้ชนิดข้อมูลแคบลงด้วย typeof

ตัวดำเนินการ typeof ใช้ทำให้ชนิดข้อมูลพื้นฐานแคบลง ภายในบล็อก if TypeScript จะทราบชนิดข้อมูลที่แน่นอนได้

function format(value: string | number | boolean): string {
  if (typeof value === 'string') {
    return value.toUpperCase(); // string here
  }
  if (typeof value === 'number') {
    return value.toFixed(2);   // number here
  }
  return String(value);        // boolean here
}

การทำให้ชนิดข้อมูลแคบลงด้วย instanceof

instanceof ใช้ทำให้ชนิดข้อมูลของอินสแตนซ์จากคลาสแคบลง TypeScript จะทราบคลาสที่เฉพาะเจาะจงภายในบล็อกนั้น

function processError(err: unknown) {
  if (err instanceof Error) {
    console.error(err.message); // Error methods available
  } else if (err instanceof Response) {
    console.error('HTTP error:', err.status);
  } else {
    console.error('Unknown:', err);
  }
}

การทำให้ชนิดข้อมูลแคบลงด้วยค่าความจริง

TypeScript จะตัด null และ undefined ออกเมื่อใช้การตรวจสอบค่าความจริง

function printLength(value: string | null | undefined) {
  if (value) {
    console.log(value.length); // string here (null/undefined filtered)
  }
}

การทำให้ชนิดข้อมูลแคบลงด้วยการเปรียบเทียบความเท่ากัน

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

function handle(action: 'submit' | 'cancel' | 'reset') {
  if (action === 'submit') {
    // action is exactly 'submit'
    doSubmit();
  }
}

การทำให้ชนิดข้อมูลแคบลงด้วยตัวดำเนินการ in

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

interface Cat { meow(): void; }
interface Dog { bark(): void; }

function speak(animal: Cat | Dog) {
  if ('meow' in animal) {
    animal.meow(); // Cat
  } else {
    animal.bark(); // Dog
  }
}

ยูเนียนแบบแยกแยะ — การทำให้ชนิดข้อมูลแคบลงตามแท็ก

ยูเนียนแบบแยกแยะมีคุณสมบัติชนิดข้อมูลลิเทอรัลร่วมกัน ซึ่งเรียกว่า ตัวแยกแยะ TypeScript จะทำให้ยูเนียนแคบลงใน switch หรือ if โดยอิงจากคุณสมบัตินั้น

type LoadingState = { status: 'loading' };
type SuccessState = { status: 'success'; data: User[] };
type ErrorState   = { status: 'error'; message: string };
type State = LoadingState | SuccessState | ErrorState;

function render(state: State) {
  switch (state.status) {
    case 'loading': return '<Spinner />';
    case 'success': return renderUsers(state.data);  // state.data available
    case 'error':   return renderError(state.message);
  }
}

เพรดิเคตชนิดข้อมูล — ตัวตรวจสอบชนิดข้อมูลแบบกำหนดเอง

ฟังก์ชันเพรดิเคตชนิดข้อมูลจะทำให้ชนิดข้อมูลแคบลงสำหรับผู้เรียก ใช้ param is Type เป็นชนิดข้อมูลผลลัพธ์

function isUser(value: unknown): value is User {
  return (
    typeof value === 'object' &&
    value !== null &&
    'name' in value &&
    typeof (value as User).name === 'string'
  );
}

const data: unknown = await fetchJson('/api/me');
if (isUser(data)) {
  console.log(data.name); // typed as User
}

ฟังก์ชันยืนยัน

ฟังก์ชันยืนยันจะโยนข้อผิดพลาดหากเงื่อนไขไม่ผ่าน และจะทำให้ชนิดข้อมูลแคบลงหลังจากเรียกใช้ฟังก์ชัน

function assertIsString(val: unknown): asserts val is string {
  if (typeof val !== 'string') throw new Error('Expected string');
}

const val: unknown = getInput();
assertIsString(val);
console.log(val.toUpperCase()); // val is string here

การตรวจสอบความครบถ้วนทุกกรณี

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

function render(state: State): string {
  switch (state.status) {
    case 'loading': return '...';
    case 'success': return state.data.length.toString();
    case 'error':   return state.message;
    default:
      const _exhaustive: never = state;
      throw new Error('Unhandled state: ' + _exhaustive);
  }
}

การทำให้ชนิดข้อมูลแคบลงด้วย Array.isArray

Array.isArray() จะทำให้ค่ามีชนิดข้อมูลเป็นอาร์เรย์

function processInput(input: string | string[]) {
  if (Array.isArray(input)) {
    return input.join(', '); // string[]
  }
  return input.toUpperCase(); // string
}

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

เทคนิคใดใช้คุณสมบัติลิเทอรัลร่วมกันเพื่อแยกรูปแบบต่าง ๆ ของชนิดข้อมูลยูเนียน

สรุป: การทำให้ชนิดข้อมูลแคบลงใน TypeScript

ใช้ typeof กับชนิดข้อมูลพื้นฐาน ใช้ instanceof กับคลาส ใช้ตัวดำเนินการ in กับโครงสร้างของอ็อบเจ็กต์ การตรวจสอบค่าความจริงใช้กรอง null และ undefined ยูเนียนแบบแยกแยะที่มีคุณสมบัติลิเทอรัลร่วมกันช่วยให้เขียนคำสั่ง switch ที่จัดการครบทุกกรณีได้ ใช้เพรดิเคตชนิดข้อมูลแบบกำหนดเอง (is) สำหรับการตรวจสอบขณะทำงานที่ซับซ้อน และใช้ never ในค่า default เพื่อตรวจสอบความครบถ้วนทุกกรณี

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

บทเรียน “การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก”

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

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

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

บทเรียน “การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก” ใช้เวลานานแค่ไหน

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

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

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

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

  1. Generics: T, extends และข้อจำกัด
  2. ชนิดข้อมูลอรรถประโยชน์: Partial, Required, Pick และ Omit
  3. ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข
  4. การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก
← กลับไปที่ Frontend Academy