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

การกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์

จับคู่ชื่อเหตุการณ์กับชนิดข้อมูลส่วนข้อมูลของเหตุการณ์

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

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

  1. การกำหนดชนิดข้อมูลให้แผนผังเหตุการณ์
  2. emit และ on ที่ปลอดภัยด้านชนิดข้อมูล
  3. คลาสตัวส่งเหตุการณ์แบบเจเนอริก
  4. การอนุมานอาร์กิวเมนต์ของตัวรับฟัง
← กลับไปที่ TypeScript Academy