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