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

ชนิดแบบมีเงื่อนไขและชนิดแบบแมปใน React

สร้างชนิด prop ของคอมโพเนนต์ที่เปลี่ยนรูปแบบตามค่าของ prop อื่นด้วยชนิดแบบมีเงื่อนไข

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

พื้นฐานชนิดตามเงื่อนไข

ชนิดตามเงื่อนไขใช้ไวยากรณ์ T extends U ? X : Y โดยหากสามารถกำหนดชนิด T ให้กับ U ได้ ชนิดนั้นจะได้ผลลัพธ์เป็น X มิฉะนั้นจะเป็น Y

type IsString<T> = T extends string ? true : false;

type A = IsString<string>;  // true
type B = IsString<number>;  // false
type C = IsString<'hello'>; // true

พร็อพตามเงื่อนไขจากพร็อพอื่น

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

type InputProps<T extends 'text' | 'number'> = {
  type: T;
} & (T extends 'number' ? { min?: number; max?: number } : { maxLength?: number });

const numInput: InputProps<'number'> = { type: 'number', min: 0, max: 100 };
const txtInput: InputProps<'text'> = { type: 'text', maxLength: 50 };

ชนิดแบบแมป

ชนิดแบบแมปจะสร้างชนิดใหม่โดยแปลงคุณสมบัติแต่ละรายการของชนิดที่มีอยู่ ไวยากรณ์ in keyof จะวนซ้ำผ่านคีย์ทั้งหมด

type Optional<T> = { [K in keyof T]?: T[K] };
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Nullable<T> = { [K in keyof T]: T[K] | null };

ทำให้พร็อพเป็นตัวเลือกสำหรับแบบฟอร์มแก้ไข

ใช้ Partial<T> ซึ่งเป็นชนิดแบบแมปที่มีมาให้ในระบบ สำหรับพร็อพของแบบฟอร์มแก้ไขที่ไม่จำเป็นต้องกรอกทุกฟิลด์

interface User { id: string; name: string; email: string; role: string; }

// Update form — all fields optional:
type UserUpdateProps = Partial<Omit<User, 'id'>>;

function UserUpdateForm(props: UserUpdateProps) {
  // name, email, role are all optional
}

ชนิดเรคคอร์ดกับชนิดแบบแมป

สร้างชนิดสำหรับค้นหาที่คีย์มาจากยูเนียน และค่ามีรูปแบบที่สอดคล้องกัน

type Status = 'idle' | 'loading' | 'success' | 'error';

type StatusConfig = Record<Status, {
  label: string;
  icon: React.ReactNode;
  color: string;
}>;

const statusConfig: StatusConfig = {
  idle: { label: 'Ready', icon: <ReadyIcon />, color: 'gray' },
  loading: { label: 'Loading...', icon: <Spinner />, color: 'blue' },
  success: { label: 'Done', icon: <CheckIcon />, color: 'green' },
  error: { label: 'Error', icon: <XIcon />, color: 'red' },
};

การเลือกคีย์ที่จำเป็น

ใช้ชนิดตามเงื่อนไขร่วมกับ -? ซึ่งใช้ลบความเป็นตัวเลือกออก เพื่อดึงเฉพาะคีย์ที่จำเป็นของชนิดหนึ่ง

type RequiredKeys<T> = {
  [K in keyof T]-?: undefined extends T[K] ? never : K;
}[keyof T];

interface FormData { name: string; email: string; phone?: string; }
type Required = RequiredKeys<FormData>; // 'name' | 'email'

ชนิดเทมเพลตลิเทอรัล

ชนิดเทมเพลตลิเทอรัลใช้ประกอบชนิดสตริงลิเทอรัล ทำให้กำหนดชนิดให้กับชื่อเหตุการณ์ สตริงคลาส CSS และเส้นทางเอพีไอได้

type EventName = 'click' | 'change' | 'focus';
type HandlerName = `on${Capitalize<EventName>}`;
// 'onClick' | 'onChange' | 'onFocus'

type ApiPath<R extends string> = `/api/${R}`;
type UserPath = ApiPath<'users'>; // '/api/users'

การดึงพร็อพตามเงื่อนไข

ใช้ Extract และ Exclude เพื่อกรองชนิดยูเนียน

type AllProps = 'onClick' | 'onHover' | 'onChange' | 'style';
type EventHandlers = Extract<AllProps, `on${string}`>;
// 'onClick' | 'onHover' | 'onChange'

type NonEventProps = Exclude<AllProps, `on${string}`>;
// 'style'

ชนิดแบบแมปสำหรับการตรวจสอบแบบฟอร์ม

สร้างชนิดข้อผิดพลาดจากการตรวจสอบที่มีรูปแบบเหมือนข้อมูลแบบฟอร์ม โดยมีข้อความข้อผิดพลาดหนึ่งข้อความต่อหนึ่งฟิลด์

interface LoginForm { email: string; password: string; }

type FormErrors<T> = { [K in keyof T]?: string };
type LoginErrors = FormErrors<LoginForm>;
// { email?: string; password?: string }

const errors: LoginErrors = { email: 'Invalid email format' };

ชนิดแบบแมปที่มีตัวจำแนก

ผสานชนิดแบบแมปกับชนิดตามเงื่อนไข เพื่อสร้างชนิดที่เปลี่ยนรูปแบบตามตัวจำแนก

type EventMap = {
  click: { x: number; y: number };
  keydown: { key: string; code: string };
  resize: { width: number; height: number };
};

type Handler<E extends keyof EventMap> = (event: EventMap[E]) => void;

function on<E extends keyof EventMap>(event: E, handler: Handler<E>) {
  window.addEventListener(event, handler as EventListener);
}

เมื่อใดไม่ควรออกแบบชนิดซับซ้อนเกินไป

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

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

ชนิดแบบแมป { [K in keyof T]?: T[K] } ทำอะไร

สรุปทบทวน

ชนิดตามเงื่อนไข (T extends U ? X : Y) สร้างชนิดที่แยกแขนงตามความสามารถในการกำหนดชนิด ชนิดแบบแมป ([K in keyof T]) แปลงคุณสมบัติแต่ละรายการของชนิดหนึ่ง ใช้ชนิดเหล่านี้สำหรับชนิดบางส่วนของแบบฟอร์มแก้ไข แมปเหตุการณ์ที่มีชนิด รูปแบบข้อผิดพลาดของแบบฟอร์ม และเส้นทางเอพีไอแบบเทมเพลตลิเทอรัล

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

บทเรียน “ชนิดแบบมีเงื่อนไขและชนิดแบบแมปใน React” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ชนิดแบบมีเงื่อนไขและชนิดแบบแมปใน React”

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

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

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

บทเรียน “ชนิดแบบมีเงื่อนไขและชนิดแบบแมปใน React” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ยูเนียนแบบแยกแยะสำหรับรูปแบบคอมโพเนนต์
  2. ชนิดแบบมีเงื่อนไขและชนิดแบบแมปใน React
  3. คอมโพเนนต์พหุรูปแบบด้วย Prop 'as'
  4. ฟอร์มปลอดภัยด้านชนิดข้อมูลและสัญญาผลตอบกลับ API
← กลับไปที่ React Academy