การจำกัดชนิดข้อมูลด้วยตัวจำแนก
ให้ TypeScript จำกัดชนิดข้อมูลของรูปแบบต่าง ๆ ในคำสั่ง switch
การจำกัดชนิดข้อมูลด้วยตัวจำแนก เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
การจำกัดชนิดด้วยตัวจำแนก
เมื่อคุณตรวจสอบตัวจำแนกแล้ว TypeScript จะจำกัดชนิดให้แคบลงเหลือสมาชิกที่ตรงกัน และเปิดให้เข้าถึงฟิลด์เฉพาะของสมาชิกนั้นได้ นี่คือประโยชน์สำคัญของรูปแบบนี้
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function area(s: Shape) {
if (s.kind === "circle") return Math.PI * s.radius ** 2;
return s.side ** 2;
}
console.log(area({ kind: "circle", radius: 2 }).toFixed(2));ใช้สวิตช์กับตัวจำแนก
การใช้ switch กับตัวจำแนกเป็นวิธีที่ชัดเจนที่สุดในการจัดการสมาชิกทุกรูปแบบ ภายในแต่ละ case ชนิดจะถูกจำกัดให้แคบลงโดยอัตโนมัติ
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function area(s: Shape): number {
switch (s.kind) {
case "circle": return Math.PI * s.radius ** 2;
case "square": return s.side ** 2;
}
}
console.log(area({ kind: "square", side: 5 }));ฟิลด์เฉพาะสมาชิกในแต่ละกรณี
ในกรณี "circle" จะเข้าถึง s.radius ได้ แต่เข้าถึง s.side ไม่ได้ TypeScript ทราบอย่างแน่ชัดว่าคุณอยู่ในสมาชิกใด
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function describe(s: Shape) {
switch (s.kind) {
case "circle": return "r=" + s.radius;
case "square": return "side=" + s.side;
}
}
console.log(describe({ kind: "circle", radius: 9 }));การจำกัดชนิดด้วย if
คุณไม่จำเป็นต้องใช้ switch การเปรียบเทียบตัวจำแนกด้วย if อย่างง่ายก็จำกัดชนิดได้อย่างมีประสิทธิภาพเช่นกัน
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function perimeter(s: Shape): number {
if (s.kind === "circle") {
return 2 * Math.PI * s.radius;
}
return 4 * s.side;
}
console.log(perimeter({ kind: "square", side: 3 }));การเข้าถึงฟิลด์ที่ไม่ถูกต้องจะล้มเหลว
ก่อนจำกัดชนิดให้แคบลง คุณไม่สามารถเข้าถึงฟิลด์เฉพาะของสมาชิกได้ TypeScript จะแจ้งข้อผิดพลาด เนื่องจากพร็อพเพอร์ตีนี้ไม่มีอยู่ในสมาชิกทุกตัว
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function broken(s: Shape) {
// Error: radius does not exist on Square
// return s.radius;
return s.kind;
}
console.log(broken({ kind: "square", side: 1 }));การจำกัดชนิดด้วยตัวจำแนกบูลีน
สำหรับยูเนียน { ok: true } | { ok: false } การตรวจสอบ if (r.ok) จะจำกัดชนิดให้เหลือสมาชิกที่สำเร็จ
type Result =
| { ok: true; data: string }
| { ok: false; error: string };
function handle(r: Result): string {
if (r.ok) return "Data: " + r.data;
return "Error: " + r.error;
}
console.log(handle({ ok: false, error: "boom" }));การจำกัดชนิดด้วยการคืนค่าก่อน
การคืนค่าก่อนเมื่อพบสมาชิกแบบหนึ่งจะจำกัดชนิดของโค้ดส่วนที่เหลือให้เหลือสมาชิกแบบอื่น ๆ วิธีนี้เป็นวิธีที่สะอาดในการจัดการแต่ละกรณีออกไปทีละกรณี
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function label(s: Shape): string {
if (s.kind === "circle") return "circle";
// s is now narrowed to Square here
return "square with side " + s.side;
}
console.log(label({ kind: "square", side: 8 }));การใช้ร่วมกับเงื่อนไขอื่น
คุณสามารถผสมการตรวจสอบตัวจำแนกเข้ากับตรรกะอื่นได้ TypeScript จะคงการจำกัดชนิดไว้ ตราบใดที่เงื่อนไขของตัวจำแนกยังเป็นจริงในแขนงนั้น
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function bigCircle(s: Shape): boolean {
return s.kind === "circle" && s.radius > 100;
}
console.log(bigCircle({ kind: "circle", radius: 150 }));การจำกัดชนิดในตัวกรองอาร์เรย์
การจำกัดชนิดทำงานภายในฟังก์ชันเรียกกลับได้เช่นกัน ในที่นี้จะตรวจสอบรูปทรงแต่ละรายการแยกกันขณะวนซ้ำ
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
const shapes: Shape[] = [
{ kind: "circle", radius: 1 },
{ kind: "square", side: 2 }
];
shapes.forEach(s => {
if (s.kind === "circle") console.log("c", s.radius);
else console.log("s", s.side);
});การคืนค่าจากสวิตช์ยังคงปลอดภัยด้านชนิด
เมื่อสวิตช์จัดการทุกกรณีและมีการคืนค่า TypeScript จะอนุมานชนิดผลลัพธ์ที่แม่นยำจากยูเนียนของผลลัพธ์ในทุกกรณี
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function tag(s: Shape) {
switch (s.kind) {
case "circle": return s.radius;
case "square": return s.side;
}
}
console.log(tag({ kind: "circle", radius: 4 }));รวมแนวคิดการจำกัดชนิด
ไม่ว่าคุณจะใช้ switch หรือ if การตรวจสอบตัวจำแนกคือสิ่งที่ทำให้เข้าถึงฟิลด์ของสมาชิกได้อย่างปลอดภัย ต่อไปเราจะรับประกันว่ามีการจัดการทุกกรณี
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
function area(s: Shape): number {
return s.kind === "circle" ? Math.PI * s.radius ** 2 : s.side ** 2;
}
console.log(Math.round(area({ kind: "circle", radius: 10 })));ตรวจสอบความเข้าใจ: การจำกัดชนิด
ตรวจสอบความเข้าใจของคุณเกี่ยวกับการจำกัดชนิดด้วยตัวจำแนก
สรุปทบทวน: การจำกัดชนิดด้วยตัวจำแนก
คุณได้เห็นแล้วว่าการตรวจสอบตัวจำแนกด้วย switch หรือ if จะจำกัดยูเนียนให้เหลือสมาชิกเพียงหนึ่งตัว และเปิดให้เข้าถึงเฉพาะฟิลด์ของสมาชิกนั้น การคืนค่าก่อนและเงื่อนไขที่ใช้ร่วมกันยังคงรักษาการจำกัดชนิดไว้ทั้งหมด
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; side: number };
const s: Shape = { kind: "square", side: 7 };
console.log(s.kind === "square" ? s.side : 0);คำถามที่พบบ่อย
บทเรียน “การจำกัดชนิดข้อมูลด้วยตัวจำแนก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจำกัดชนิดข้อมูลด้วยตัวจำแนก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจำกัดชนิดข้อมูลด้วยตัวจำแนก”
ให้ TypeScript จำกัดชนิดข้อมูลของรูปแบบต่าง ๆ ในคำสั่ง switch คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การจำกัดชนิดข้อมูลด้วยตัวจำแนก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างยูเนียนแบบจำแนก
- การจำกัดชนิดข้อมูลด้วยตัวจำแนก
- การตรวจสอบความครอบคลุมทั้งหมดด้วย never
- การจำลองเครื่องสถานะ