สถานะที่อนุมานและตัวเลือกด้วยชนิด
เขียนฟังก์ชันตัวเลือกที่ระบุชนิดสำหรับสถานะที่คำนวณ
สถานะที่อนุมานและตัวเลือกด้วยชนิด เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
state ที่คำนวณได้คืออะไร
state ที่คำนวณได้คือ state ที่คำนวณจาก state อื่น เช่น การใช้ filter กับรายการหรือการหาผลรวมของค่า ฟังก์ชันเลือกข้อมูลจะห่อหุ้มการคำนวณนี้ และสามารถจดจำผลลัพธ์เพื่อเพิ่มประสิทธิภาพได้
// Raw state
const users: User[] = [/* ... */];
// Derived state: active users only
const activeUsers = users.filter(u => u.isActive);ฟังก์ชันเลือกข้อมูลที่มีชนิดข้อมูล
เขียนฟังก์ชันเลือกข้อมูลพร้อมชนิดข้อมูลที่ส่งคืนอย่างชัดเจน เพื่ออธิบายสิ่งที่ฟังก์ชันคำนวณและป้องกันชนิดข้อมูลที่ค่อย ๆ ไม่สอดคล้องกัน
import type { RootState } from "./store";
const selectActiveUsers = (state: RootState): User[] =>
state.users.filter((u) => u.isActive);
const selectUserCount = (state: RootState): number =>
state.users.length;reselect: ฟังก์ชันเลือกข้อมูลที่จดจำผลลัพธ์
ไลบรารี reselect (ที่ RTK ใช้) สร้างฟังก์ชันเลือกข้อมูลที่จดจำผลลัพธ์ โดยจะคำนวณใหม่เฉพาะเมื่อ input เปลี่ยนแปลง
import { createSelector } from "reselect";
const selectActiveUsers = createSelector(
(state: RootState) => state.users,
(users) => users.filter((u) => u.isActive)
);
// Return type inferred: User[]ฟังก์ชันเลือกข้อมูลแบบมีพารามิเตอร์ที่มีชนิดข้อมูล
ฟังก์ชันเลือกข้อมูลแบบโรงงานรับอาร์กิวเมนต์แล้วส่งคืนฟังก์ชันเลือกข้อมูล เหมาะสำหรับการค้นหาแยกตามเอนทิตี
const selectUserById = (id: string) =>
createSelector(
(state: RootState) => state.users,
(users) => users.find((u) => u.id === id) ?? null
);
// Usage: const user = useAppSelector(selectUserById("123"));ฟังก์ชันเลือกข้อมูลของ Zustand
ใน Zustand ให้ส่งฟังก์ชันเลือกข้อมูลที่มีชนิดข้อมูลให้กับฮุกของ store เพื่ออ่านเฉพาะส่วนที่จำเป็น
const activeUsers = useUserStore((s) => s.users.filter(u => u.isActive));
// Inferred type: User[]state ที่คำนวณได้ใน React ด้วย useMemo
สำหรับ state ที่คำนวณได้ภายในเครื่อง ให้ใช้ useMemo พร้อมคำอธิบายชนิดข้อมูลที่เหมาะสม เพื่อจดจำค่าที่คำนวณแล้วในคอมโพเนนต์
const sortedUsers = useMemo(
(): User[] => [...users].sort((a, b) => a.name.localeCompare(b.name)),
[users]
);การประกอบฟังก์ชันเลือกข้อมูล
สร้างฟังก์ชันเลือกข้อมูลที่ซับซ้อนด้วยการประกอบฟังก์ชันที่เรียบง่ายกว่าเข้าด้วยกัน โดย reselect จะจัดการการจดจำผลลัพธ์ตลอดสายการทำงาน
const selectActiveUserNames = createSelector(
selectActiveUsers,
(users) => users.map((u) => u.name)
); // string[]Zustand ที่ปลอดภัยด้านชนิดข้อมูลด้วย immer สำหรับการอัปเดตที่คำนวณได้
เมื่อคำนวณการอัปเดตที่ได้จาก state อื่น ให้ใช้ immer เพื่อแก้ไข state ฉบับร่าง โดย TypeScript จะตรวจสอบว่ามีการแตะต้องเฉพาะคุณสมบัติที่ถูกต้อง
const useStore = create<AppStore>()(immer((set) => ({
users: [],
activeCount: 0,
setUsers: (users) =>
set((draft) => {
draft.users = users;
draft.activeCount = users.filter((u) => u.isActive).length;
}),
})));การอนุมานชนิดข้อมูลที่ส่งคืนของฟังก์ชันเลือกข้อมูล
TypeScript อนุมานชนิดข้อมูลที่ส่งคืนจากฟังก์ชันเลือกข้อมูลได้ แต่การระบุชนิดข้อมูลอย่างชัดเจนช่วยให้อ่านง่ายขึ้นและป้องกัน any ที่เกิดขึ้นโดยไม่ตั้งใจจาก expression แบบไดนามิก
// Inferred — may widen to any for complex expressions
const selectTotals = createSelector(
(s: RootState) => s.cart.items,
(items) => items.reduce((sum, i) => sum + i.price, 0) // inferred: number
);การทดสอบฟังก์ชันเลือกข้อมูล
ฟังก์ชันเลือกข้อมูลเป็นฟังก์ชันบริสุทธิ์ ให้ทดสอบโดยส่ง state จำลองเข้าไป แล้วตรวจสอบชนิดข้อมูลและค่าของ output
test("selectActiveUsers", () => {
const state = { users: [{ id: "1", isActive: true }, { id: "2", isActive: false }] } as RootState;
expect(selectActiveUsers(state)).toHaveLength(1);
});สรุป: ฟังก์ชันเลือกข้อมูลที่มีชนิดข้อมูล
ฟังก์ชันเลือกข้อมูลที่มีชนิดข้อมูล: เขียนฟังก์ชันที่รับ RootState พร้อมชนิดข้อมูลที่ส่งคืนอย่างชัดเจน ใช้ createSelector เพื่อจดจำผลลัพธ์ ประกอบฟังก์ชันเลือกข้อมูลสำหรับการคำนวณที่ซับซ้อน และทดสอบฟังก์ชันเหล่านั้นในฐานะฟังก์ชันบริสุทธิ์
ตรวจสอบความเข้าใจ
createSelector มีข้อดีอย่างไรเหนือฟังก์ชันเลือกข้อมูลทั่วไป
สิ่งที่คุณได้เรียนรู้
ฟังก์ชันเลือกข้อมูลที่มีชนิดข้อมูลรับ RootState และส่งคืนค่าที่คำนวณจาก state ซึ่งมีชนิดข้อมูลแม่นยำ ใช้ createSelector เพื่อจดจำผลลัพธ์ ประกอบฟังก์ชันเลือกข้อมูลสำหรับตรรกะที่ซับซ้อน และเขียนฟังก์ชันเลือกข้อมูลแบบโรงงานสำหรับการค้นหาเอนทิตีด้วยพารามิเตอร์
คำถามที่พบบ่อย
บทเรียน “สถานะที่อนุมานและตัวเลือกด้วยชนิด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สถานะที่อนุมานและตัวเลือกด้วยชนิด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สถานะที่อนุมานและตัวเลือกด้วยชนิด”
เขียนฟังก์ชันตัวเลือกที่ระบุชนิดสำหรับสถานะที่คำนวณ คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “สถานะที่อนุมานและตัวเลือกด้วยชนิด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การระบุชนิดสไลซ์และธังก์ของ Redux Toolkit
- รูปแบบการระบุชนิดสโตร์ Zustand
- XState: เครื่องจักรสถานะที่ระบุชนิด
- สถานะที่อนุมานและตัวเลือกด้วยชนิด