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

การสร้างยูเนียนแบบจำแนก

ติดป้ายสมาชิกยูเนียนด้วยคุณสมบัติจำแนกร่วมกัน

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

ยูเนียนแบบมีตัวจำแนกคืออะไร

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

// The shared "kind" property is the discriminant
type Circle = { kind: "circle"; radius: number };
type Square = { kind: "square"; side: number };
type Shape = Circle | Square;

พร็อพเพอร์ตีตัวจำแนก

ตัวจำแนกต้องเป็นชนิดลิเทอรัล (เช่น "circle") ไม่ใช่ชนิดกว้างอย่าง string สมาชิกแต่ละตัวจะมีค่าลิเทอรัลเฉพาะของตนเอง

type Circle = { kind: "circle"; radius: number };
type Square = { kind: "square"; side: number };

const c: Circle = { kind: "circle", radius: 10 };
console.log(c.kind); // "circle"

สมาชิกแต่ละตัวมีฟิลด์ของตนเอง

นอกเหนือจากตัวจำแนกร่วมแล้ว สมาชิกแต่ละตัวยังมีฟิลด์ที่เหมาะสมกับสมาชิกนั้นเท่านั้น วงกลมมี radius ส่วนสี่เหลี่ยมจัตุรัสมี side

type Circle = { kind: "circle"; radius: number };
type Square = { kind: "square"; side: number };
type Rectangle = { kind: "rectangle"; width: number; height: number };
type Shape = Circle | Square | Rectangle;

การสร้างค่าจากยูเนียน

เมื่อคุณสร้างค่า TypeScript จะตรวจสอบว่ารูปร่างของค่านั้นตรงกับสมาชิกของยูเนียนเพียงหนึ่งตัว โดยพิจารณาจาก kind

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; side: number };

const shapes: Shape[] = [
  { kind: "circle", radius: 5 },
  { kind: "square", side: 4 }
];
console.log(shapes.length); // 2

ทำไมไม่ใช้ฟิลด์ที่เป็นตัวเลือกเท่านั้น

ชนิดแบบหลวมที่มีฟิลด์เป็นตัวเลือก (radius?, side?) เปิดให้เกิดการผสมค่าที่ไม่ถูกต้องได้ ยูเนียนแบบมีตัวจำแนกทำให้สถานะที่ไม่ถูกต้องไม่สามารถแสดงแทนได้

// Loose and error-prone: nothing stops radius + side together
type BadShape = { radius?: number; side?: number };
const bad: BadShape = { radius: 5, side: 4 }; // nonsense, but allowed

คุณเลือกชื่อตัวจำแนกได้เอง

โดยทั่วไปแท็กนี้มักเรียกว่า kind หรือ type แต่จะใช้ชื่อใดก็ได้ ตราบใดที่สมาชิกทุกตัวใช้ชื่อพร็อพเพอร์ตีเดียวกันและมีค่าลิเทอรัลที่แตกต่างกัน

type Event =
  | { type: "click"; x: number; y: number }
  | { type: "scroll"; delta: number };

const e: Event = { type: "click", x: 10, y: 20 };
console.log(e.type); // "click"

การสร้างแบบจำลองตัวคำนวณพื้นที่รูปทรง

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

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; side: number };

const myShapes: Shape[] = [
  { kind: "circle", radius: 3 },
  { kind: "square", side: 6 }
];
console.log("Count:", myShapes.length);

การเพิ่มรูปแบบย่อยที่สาม

ยูเนียนสามารถขยายเพิ่มเติมได้ การเพิ่มสมาชิก triangle ใช้การแก้ไขเพียงหนึ่งบรรทัด และ TypeScript จะติดตามการเปลี่ยนแปลงนี้ทุกจุดที่ใช้ยูเนียน

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; side: number }
  | { kind: "triangle"; base: number; height: number };

const t: Shape = { kind: "triangle", base: 4, height: 8 };
console.log(t.kind);

ลิเทอรัลที่ไม่ซ้ำกันช่วยป้องกันการทับซ้อน

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

type A = { kind: "a"; value: number };
type B = { kind: "b"; label: string };
type Union = A | B;

function describe(u: Union) {
  return u.kind === "a" ? u.value : u.label;
}
console.log(describe({ kind: "b", label: "hi" }));

ตัวจำแนกที่มีแท็กบูลีน

ตัวจำแนกไม่จำเป็นต้องเป็นสตริง ลิเทอรัล boolean ก็ใช้ได้เช่นกัน ซึ่งเหมาะสำหรับผลลัพธ์ที่สำเร็จหรือไม่สำเร็จ

type Result =
  | { ok: true; data: string }
  | { ok: false; error: string };

const r: Result = { ok: true, data: "loaded" };
console.log(r.ok ? r.data : r.error);

ยูเนียนแบบมีตัวจำแนกในการใช้งานจริง

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

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; side: number };

const sample: Shape = { kind: "circle", radius: 7 };
console.log(sample.kind, "ready");

ตรวจสอบความเข้าใจ: ตัวจำแนก

ตรวจสอบความเข้าใจของคุณเกี่ยวกับยูเนียนแบบมีตัวจำแนก

สรุปทบทวน: การสร้างยูเนียนแบบมีตัวจำแนก

คุณได้เรียนรู้ว่ายูเนียนแบบมีตัวจำแนกรวมชนิดออบเจ็กต์ที่ใช้ตัวจำแนกลิเทอรัลร่วมกัน เช่น kind สมาชิกแต่ละตัวมีฟิลด์ของตนเอง ลิเทอรัลที่ไม่ซ้ำกันช่วยป้องกันการทับซ้อน และรูปแบบนี้ทำให้สถานะที่ไม่ถูกต้องไม่สามารถแสดงแทนได้

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; side: number };

const done: Shape = { kind: "square", side: 2 };
console.log("Recap complete:", done.kind);

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

บทเรียน “การสร้างยูเนียนแบบจำแนก” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างยูเนียนแบบจำแนก”

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

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

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

บทเรียน “การสร้างยูเนียนแบบจำแนก” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การสร้างยูเนียนแบบจำแนก
  2. การจำกัดชนิดข้อมูลด้วยตัวจำแนก
  3. การตรวจสอบความครอบคลุมทั้งหมดด้วย never
  4. การจำลองเครื่องสถานะ
← กลับไปที่ TypeScript Academy