ชนิดแบบมีเงื่อนไขและชนิดแบบแมปใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ยูเนียนแบบแยกแยะสำหรับรูปแบบคอมโพเนนต์
- ชนิดแบบมีเงื่อนไขและชนิดแบบแมปใน React
- คอมโพเนนต์พหุรูปแบบด้วย Prop 'as'
- ฟอร์มปลอดภัยด้านชนิดข้อมูลและสัญญาผลตอบกลับ API