การกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์
จับคู่ชื่อเหตุการณ์กับชนิดข้อมูลส่วนข้อมูลของเหตุการณ์
การกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์ เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
แผนผังเหตุการณ์คืออะไร
แผนผังเหตุการณ์คืออินเทอร์เฟซที่เชื่อมชื่อเหตุการณ์แต่ละชื่อเข้ากับรูปแบบของข้อมูลประกอบเหตุการณ์ แผนผังนี้เป็นแหล่งข้อมูลจริงเพียงแห่งเดียวของระบบเหตุการณ์
interface Events {
login: { userId: string };
logout: void;
}
// "login" carries a payload; "logout" carries none.การจับคู่ชื่อกับข้อมูลประกอบ
คีย์ของคุณสมบัติแต่ละรายการคือชื่อเหตุการณ์ และชนิดข้อมูลของค่าคือข้อมูลประกอบ วิธีนี้ทำให้ระบบชนิดข้อมูลทราบอย่างแน่ชัดว่าแต่ละเหตุการณ์ต้องการข้อมูลใด
interface Events {
message: { text: string; from: string };
typing: { userId: string };
}
const sample: Events["message"] = { text: "hi", from: "ada" };
console.log(sample.text, sample.from);เหตุการณ์ที่ไม่มีข้อมูลประกอบ
เหตุการณ์บางรายการไม่มีข้อมูลใด ๆ ติดมาด้วย ให้จำลองเหตุการณ์เหล่านี้ด้วย void หรือออบเจ็กต์ว่าง เพื่อสื่อว่าไม่มีข้อมูลที่ต้องส่ง
interface Events {
open: void;
close: void;
}
// Handlers for these receive no meaningful argument.
console.log("payloadless events use void");การแยกชนิดข้อมูลชื่อเหตุการณ์
ใช้ keyof เพื่อรับยูเนียนของชื่อเหตุการณ์ที่ถูกต้องทั้งหมดจากแผนผัง ซึ่งมีประโยชน์สำหรับจำกัดพารามิเตอร์ของฟังก์ชัน
interface Events {
login: { userId: string };
logout: void;
}
type EventName = keyof Events; // "login" | "logout"
const e: EventName = "login";
console.log(e);การค้นหาชนิดข้อมูลประกอบเหตุการณ์
ใช้ชื่อเหตุการณ์เป็นดัชนีของแผนผังเพื่อรับชนิดข้อมูลประกอบของเหตุการณ์นั้น: Events["login"] คือ { userId: string }
interface Events {
login: { userId: string };
logout: void;
}
type LoginPayload = Events["login"]; // { userId: string }
const p: LoginPayload = { userId: "u1" };
console.log(p.userId);แผนผังเหตุการณ์ที่สมบูรณ์ยิ่งขึ้น
แอปจริงมีเหตุการณ์มากมาย แต่ละเหตุการณ์จึงได้รับข้อตกลงข้อมูลประกอบที่ชัดเจนในที่เดียว ทำให้ผู้ส่งและผู้รับเห็นพ้องกันเสมอ
interface Events {
cartAdd: { productId: string; qty: number };
cartRemove: { productId: string };
checkout: { total: number };
}
const a: Events["cartAdd"] = { productId: "p1", qty: 2 };
console.log(a.productId, a.qty);ข้อมูลประกอบสามารถเป็นยูเนียนได้
ชนิดข้อมูลประกอบสามารถเป็นยูเนียนแบบมีตัวจำแนกได้ ทำให้เหตุการณ์เดียวรองรับรูปแบบข้อมูลที่เกี่ยวข้องกันหลายรูปแบบ
interface Events {
status:
| { kind: "online" }
| { kind: "offline"; since: number };
}
const s: Events["status"] = { kind: "offline", since: 100 };
console.log(s.kind);การนำชนิดข้อมูลประกอบกลับมาใช้ใหม่
คุณสามารถกำหนดชนิดข้อมูลประกอบแยกต่างหาก แล้วอ้างอิงชนิดเหล่านั้นในแผนผัง เพื่อให้อินเทอร์เฟซเป็นระเบียบและนำรูปแบบข้อมูลกลับมาใช้ใหม่ได้
type User = { id: string; name: string };
interface Events {
userCreated: User;
userDeleted: { id: string };
}
const u: Events["userCreated"] = { id: "1", name: "Ada" };
console.log(u.name);เหตุผลที่แผนผังดีกว่าสตริงที่ไม่มีการตรวจสอบ
หากไม่มีแผนผัง ชื่อเหตุการณ์จะเป็นเพียงสตริง และข้อมูลประกอบจะเป็น any แผนผังช่วยให้เติมข้อความอัตโนมัติ ตรวจสอบความถูกต้อง และมีข้อตกลงที่ชัดเจน
// Loose: emit("login", { usrId: "x" }) typo unnoticed, payload any
// Mapped: the interface forces the correct name and payload shape.
console.log("the map is the contract");แผนผังเป็นตัวขับเคลื่อนส่วนเชื่อมต่อโปรแกรม
ในบทเรียนถัดไป emit และ on จะเป็นแบบทั่วไปเหนือแผนผังเหตุการณ์ โดยใช้ keyof และการเข้าถึงด้วยดัชนี เพื่อรักษาความปลอดภัยด้านชนิดข้อมูล
interface Events {
login: { userId: string };
logout: void;
}
type Name = keyof Events;
type PayloadOf<K extends Name> = Events[K];
const id: PayloadOf<"login"> = { userId: "u" };
console.log(id.userId);แหล่งข้อมูลจริงเพียงแห่งเดียว
เนื่องจากทุกอย่างสร้างมาจากแผนผังเหตุการณ์ การเปลี่ยนข้อมูลประกอบในที่เดียวจึงอัปเดต emit และตัวจัดการทุกตัวที่ใช้ข้อมูลนั้น
interface Events {
ping: { at: number };
}
const p: Events["ping"] = { at: Date.now() };
console.log(typeof p.at);ตรวจสอบความเข้าใจอย่างรวดเร็ว: แผนผังเหตุการณ์
ทดสอบความเข้าใจเกี่ยวกับการกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์
สรุป: การกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์
คุณเรียนรู้การจำลองเหตุการณ์เป็นอินเทอร์เฟซที่จับคู่ชื่อกับข้อมูลประกอบ โดยใช้ void สำหรับเหตุการณ์ที่ไม่มีข้อมูลประกอบ ใช้ keyof สำหรับชื่อ และใช้การเข้าถึงด้วยดัชนีสำหรับชนิดข้อมูลประกอบ ซึ่งเป็นรากฐานของระบบเหตุการณ์ที่ปลอดภัยด้านชนิดข้อมูล
interface Events { login: { userId: string }; logout: void }
type Name = keyof Events;
const n: Name = "logout";
console.log(n);คำถามที่พบบ่อย
บทเรียน “การกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์
- emit และ on ที่ปลอดภัยด้านชนิดข้อมูล
- คลาสตัวส่งเหตุการณ์แบบเจเนอริก
- การอนุมานอาร์กิวเมนต์ของตัวรับฟัง