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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การระบุชนิดสไลซ์และธังก์ของ Redux Toolkit
- รูปแบบการระบุชนิดสโตร์ Zustand
- XState: เครื่องจักรสถานะที่ระบุชนิด
- สถานะที่อนุมานและตัวเลือกด้วยชนิด