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

สถานะที่อนุมานและตัวเลือกด้วยชนิด

เขียนฟังก์ชันตัวเลือกที่ระบุชนิดสำหรับสถานะที่คำนวณ

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

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

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