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

XState: เครื่องจักรสถานะที่ระบุชนิด

จำลองเครื่องจักรสถานะด้วย TypeScript ใน XState

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

เหตุใดจึงใช้ XState ร่วมกับ TypeScript

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

import { createMachine, assign } from "xstate";

การกำหนดชนิดข้อมูลของเครื่องจักร

XState v5 ใช้พารามิเตอร์ชนิดข้อมูลสำหรับบริบท เหตุการณ์ และสถานะ ให้กำหนดสิ่งเหล่านี้ก่อนสร้างเครื่องจักร

type TrafficContext = { count: number };
type TrafficEvent =
  | { type: "TURN_GREEN" }
  | { type: "TURN_YELLOW" }
  | { type: "TURN_RED" };

การสร้างเครื่องจักรที่มีชนิดข้อมูล

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

const trafficMachine = createMachine({
  types: {} as { context: TrafficContext; events: TrafficEvent },
  id: "traffic",
  initial: "red",
  context: { count: 0 },
  states: {
    red:    { on: { TURN_GREEN: "green" } },
    green:  { on: { TURN_YELLOW: "yellow" } },
    yellow: { on: { TURN_RED: "red" } },
  },
});

บริบทที่มีชนิดข้อมูลด้วย assign

ใช้ assign เพื่ออัปเดตบริบท โดย TypeScript จะตรวจสอบว่าบริบทบางส่วนที่ส่งคืนตรงกับชนิดข้อมูลที่กำหนดไว้

const machine = createMachine({
  types: {} as { context: TrafficContext; events: TrafficEvent },
  // ...
  entry: assign({ count: 0 }),
  on: {
    TURN_GREEN: {
      actions: assign(({ context }) => ({ count: context.count + 1 })),
    },
  },
});

การใช้เครื่องจักรใน React

ฮุก useMachine จาก @xstate/react ส่งคืน state และฟังก์ชันส่งเหตุการณ์ที่มีชนิดข้อมูล

import { useMachine } from "@xstate/react";

function TrafficLight() {
  const [state, send] = useMachine(trafficMachine);
  // state.value: "red" | "green" | "yellow"
  // send: (event: TrafficEvent) => void
  return <button onClick={() => send({ type: "TURN_GREEN" })}>Go</button>;
}

ตัวตรวจสอบเงื่อนไขที่มีชนิดข้อมูล

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

const machine = createMachine({
  types: {} as { context: TrafficContext; events: TrafficEvent },
  states: {
    red: {
      on: {
        TURN_GREEN: {
          guard: ({ context }) => context.count < 10, // context: TrafficContext
          target: "green",
        },
      },
    },
  },
});

การกระทำที่มีชนิดข้อมูล

การกระทำที่มีชื่อสามารถระบุชนิดข้อมูลได้โดยประกาศไว้ในการกำหนดค่าเครื่องจักร แล้วนำไปใช้งานผ่าน setup

import { setup } from "xstate";
const machine = setup({
  types: {} as { context: TrafficContext; events: TrafficEvent },
  actions: {
    logTransition: ({ context, event }) => {
      console.log(context.count, event.type);
    },
  },
}).createMachine({ /* ... */ });

สถานะแบบขนาน

XState รองรับภูมิภาคแบบขนาน (ตั้งฉาก) โดย TypeScript จะติดตามค่าของสถานะแบบขนานในรูปออบเจ็กต์

states: {
  ui: {
    type: "parallel",
    states: {
      modal: { initial: "closed", states: { closed: {}, open: {} } },
      tooltip: { initial: "hidden", states: { hidden: {}, visible: {} } },
    },
  },
}

การตรวจสอบ state

ใช้ state.matches() เพื่อตรวจสอบ state ปัจจุบัน โดย XState จะตรวจสอบชนิดข้อมูลนี้กับชื่อสถานะที่รู้จัก

const [state] = useMachine(trafficMachine);
if (state.matches("green")) {
  // TypeScript knows we're in the green state
}

XState Inspector

เชื่อมต่อ XState Inspector เพื่อดีบักเครื่องจักรสถานะด้วยภาพระหว่างการพัฒนา โดยไม่สูญเสียความปลอดภัยด้านชนิดข้อมูลในโค้ดระบบจริง

import { inspect } from "@xstate/inspect";
inspect({ iframe: false }); // opens state machine inspector

สรุป: การระบุชนิดข้อมูลให้ XState

เครื่องจักรของ XState ที่มีชนิดข้อมูลจะกำหนดชนิดข้อมูลของบริบทและเหตุการณ์ ใช้ assign เพื่ออัปเดตบริบทที่มีชนิดข้อมูล และผสานกับ React ผ่าน useMachine เพื่อให้ state และการส่งเหตุการณ์มีชนิดข้อมูลครบถ้วน

ตรวจสอบความเข้าใจ

คุณสมบัติ types ในการกำหนดค่าเครื่องจักรของ XState v5 มีหน้าที่อะไร

สิ่งที่คุณได้เรียนรู้

XState ร่วมกับ TypeScript ช่วยให้คุณสร้างเครื่องจักรสถานะที่มีชนิดข้อมูลครบถ้วน กำหนดชนิดข้อมูลของบริบทและเหตุการณ์ ใช้ assign เพื่ออัปเดตที่มีชนิดข้อมูล ตรวจสอบเงื่อนไข และกำหนดการกระทำ ฮุก useMachine มอบ state และการส่งเหตุการณ์ที่มีชนิดข้อมูลในคอมโพเนนต์ React

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

บทเรียน “XState: เครื่องจักรสถานะที่ระบุชนิด” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “XState: เครื่องจักรสถานะที่ระบุชนิด”

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

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

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

บทเรียน “XState: เครื่องจักรสถานะที่ระบุชนิด” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การระบุชนิดสไลซ์และธังก์ของ Redux Toolkit
  2. รูปแบบการระบุชนิดสโตร์ Zustand
  3. XState: เครื่องจักรสถานะที่ระบุชนิด
  4. สถานะที่อนุมานและตัวเลือกด้วยชนิด
← กลับไปที่ TypeScript Academy