รูปแบบการระบุชนิดสโตร์ Zustand
กำหนดสโตร์ Zustand ที่ระบุชนิดด้วยอินเทอร์เฟซและแอ็กชัน
รูปแบบการระบุชนิดสโตร์ Zustand เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงระบุชนิดข้อมูลให้ Zustand
Zustand เป็นไลบรารีจัดการ state ขนาดเล็ก การผสาน TypeScript อย่างเหมาะสมช่วยให้การอ่าน store, actions และฟังก์ชันเลือกข้อมูลปลอดภัยด้านชนิดข้อมูลโดยไม่ต้องเขียนโค้ดประกอบมากเกินไป
import { create } from "zustand";store พื้นฐานที่มีชนิดข้อมูล
กำหนดส่วนติดต่อของ store แล้วส่งเป็นชนิดข้อมูลทั่วไปให้กับ create
interface CounterStore {
count: number;
increment: () => void;
decrement: () => void;
}
const useCounter = create<CounterStore>((set) => ({
count: 0,
increment: () => set((s) => ({ count: s.count + 1 })),
decrement: () => set((s) => ({ count: s.count - 1 })),
}));การอ่าน state จาก store
ใช้ฮุกร่วมกับฟังก์ชันเลือกข้อมูลเพื่ออ่านส่วนที่ต้องการของ state โดย TypeScript จะอนุมานชนิดข้อมูลที่ส่งคืนจากฟังก์ชันเลือกข้อมูล
function Counter() {
const count = useCounter((s) => s.count); // number
const increment = useCounter((s) => s.increment); // () => void
return <button onClick={increment}>{count}</button>;
}การแยก state และ actions
รูปแบบที่ใช้กันทั่วไปคือแยกคุณสมบัติของ state ออกจากเมธอดของ actions ในส่วนติดต่อ เพื่อจัดระเบียบให้ชัดเจนยิ่งขึ้น
interface State { count: number; }
interface Actions { increment: () => void; reset: () => void; }
type CounterStore = State & Actions;การกระทำแบบอะซิงโครนัสใน Zustand
Zustand รองรับการกระทำแบบอะซิงโครนัสในตัว เพียงทำให้ฟังก์ชันการกระทำเป็นแบบอะซิงโครนัสภายในตัวสร้าง
interface UserStore {
users: User[];
fetchUsers: () => Promise<void>;
}
const useUserStore = create<UserStore>((set) => ({
users: [],
fetchUsers: async () => {
const data = await api.getUsers();
set({ users: data });
},
}));การระบุชนิดข้อมูลให้มิดเดิลแวร์ immer
ใช้มิดเดิลแวร์ immer ของ Zustand เพื่ออัปเดตในรูปแบบที่แก้ไขค่าได้ ชนิดข้อมูลของ store จะถูกส่งต่ออย่างถูกต้อง
import { immer } from "zustand/middleware/immer";
const useStore = create<CounterStore>()(
immer((set) => ({
count: 0,
increment: () => set((state) => { state.count++; }),
}))
);มิดเดิลแวร์ devtools
ผสาน devtools เข้ากับการระบุชนิดข้อมูลอย่างเหมาะสม เพื่อเปิดใช้การรองรับ Redux DevTools โดยยังคงชนิดข้อมูลไว้อย่างครบถ้วน
import { devtools } from "zustand/middleware";
const useStore = create<CounterStore>()(
devtools(
(set) => ({ count: 0, increment: () => set({ count: 1 }) }),
{ name: "CounterStore" }
)
);การระบุชนิดข้อมูลให้ store ที่คงอยู่
มิดเดิลแวร์ persist แปลง state เป็นข้อมูลอนุกรมแล้วจัดเก็บใน localStorage ให้ระบุชนิดข้อมูลอย่างถูกต้องด้วยส่วนติดต่อของ state บางส่วน
import { persist } from "zustand/middleware";
const useStore = create<CounterStore>()(
persist(
(set) => ({ count: 0, increment: () => set((s) => ({ count: s.count + 1 })) }),
{ name: "counter-storage" }
)
);รูปแบบ slice ที่มีชนิดข้อมูล
สำหรับ store ขนาดใหญ่ ให้แยกเป็น slice ที่มีชนิดข้อมูล แล้วนำมารวมกันในการเรียกใช้ create เพียงครั้งเดียว
type UserSlice = { users: User[]; setUsers: (u: User[]) => void; };
type UiSlice = { modal: boolean; openModal: () => void; };
type AppStore = UserSlice & UiSlice;การสมัครรับการเปลี่ยนแปลงนอก React
เข้าถึง state ของ store และสมัครรับการเปลี่ยนแปลงนอกคอมโพเนนต์ React ได้โดยใช้ API ของ store ที่มีชนิดข้อมูล
// Access current state outside React
const count = useCounter.getState().count;
// Subscribe to changes
useCounter.subscribe((state) => console.log(state.count));สรุป: การระบุชนิดข้อมูลให้ Zustand
การระบุชนิดข้อมูลให้ Zustand: กำหนดส่วนติดต่อของ store ส่งให้ create<T> ใช้ฟังก์ชันเลือกข้อมูลเพื่ออ่าน state ที่มีชนิดข้อมูล และวางมิดเดิลแวร์ (immer, devtools, persist) ผ่านรูปแบบเคอร์รีเพื่อให้ชนิดข้อมูลถูกส่งต่ออย่างถูกต้อง
ตรวจสอบความเข้าใจ
ในคอมโพเนนต์ คุณจะอ่านส่วนที่ต้องการของ state จาก Zustand โดยไม่ทำให้เกิดการเรนเดอร์ใหม่เมื่อส่วนอื่นเปลี่ยนแปลงได้อย่างไร
สิ่งที่คุณได้เรียนรู้
store ของ Zustand มีชนิดข้อมูลโดยส่งส่วนติดต่อเป็นชนิดข้อมูลทั่วไปให้กับ create<T> ใช้ฟังก์ชันเลือกข้อมูลเพื่ออ่าน state อย่างมีประสิทธิภาพและปลอดภัยด้านชนิดข้อมูล ผสานมิดเดิลแวร์อย่าง immer, devtools และ persist ผ่านรูปแบบเคอร์รีของ Zustand เพื่อให้ TypeScript อนุมานชนิดข้อมูลได้อย่างถูกต้อง
คำถามที่พบบ่อย
บทเรียน “รูปแบบการระบุชนิดสโตร์ Zustand” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบการระบุชนิดสโตร์ Zustand” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบการระบุชนิดสโตร์ Zustand”
กำหนดสโตร์ Zustand ที่ระบุชนิดด้วยอินเทอร์เฟซและแอ็กชัน คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “รูปแบบการระบุชนิดสโตร์ Zustand” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การระบุชนิดสไลซ์และธังก์ของ Redux Toolkit
- รูปแบบการระบุชนิดสโตร์ Zustand
- XState: เครื่องจักรสถานะที่ระบุชนิด
- สถานะที่อนุมานและตัวเลือกด้วยชนิด