ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข
สร้างชนิดข้อมูลแบบแมปเพื่อแปลงคุณสมบัติทั้งหมดของชนิดข้อมูล และใช้ชนิดข้อมูลแบบมีเงื่อนไขร่วมกับ infer เพื่อเขียนตรรกะระดับชนิดข้อมูลขั้นสูง
ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชนิดข้อมูลแบบแมป — แปลงทุกคุณสมบัติ
ชนิดข้อมูลแบบแมปจะวนซ้ำผ่านคีย์ของชนิดข้อมูลและแปลงคีย์เหล่านั้น ชนิดข้อมูลเหล่านี้เป็นพื้นฐานของชนิดยูทิลิตี Partial, Readonly และ Record
// Partial implemented as a mapped type:
type MyPartial<T> = {
[K in keyof T]?: T[K];
};
// Readonly:
type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
};การแมปคีย์ใหม่ด้วย as
ใช้ as ในส่วนคำสั่งการแมปเพื่อแมปชื่อคีย์ใหม่ ใช้ร่วมกับชนิดลิเทอรัลของแม่แบบเพื่อสร้างการแปลงที่ทรงพลัง
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
type UserGetters = Getters<{ name: string; age: number }>;
// { getName: () => string; getAge: () => number }การกรองคุณสมบัติด้วย never
ส่งคืน never จากการแมปคีย์ใหม่เพื่อลบคุณสมบัตินั้นออกจากชนิดข้อมูลผลลัพธ์
// Keep only function-valued properties:
type FunctionProperties<T> = {
[K in keyof T as T[K] extends Function ? K : never]: T[K];
};ชนิดข้อมูลแบบมีเงื่อนไข — if/else สำหรับชนิดข้อมูล
ชนิดข้อมูลแบบมีเงื่อนไขใช้รูปแบบ T extends U ? TrueType : FalseType โดยประเมินในระดับชนิดข้อมูล ไม่ใช่ขณะทำงานจริง
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
type Flatten<T> = T extends Array<infer E> ? E : T;
type StrArr = Flatten<string[]>; // string
type Num = Flatten<number>; // numberชนิดข้อมูลแบบมีเงื่อนไขชนิดกระจาย
เมื่อ T เป็นยูเนียน ชนิดข้อมูลแบบมีเงื่อนไขจะกระจายการประเมินไปยังสมาชิกแต่ละตัว string | number extends string ? ... จะตรวจสอบแต่ละตัวแยกกัน: (string extends string ? ...) | (number extends string ? ...)
type ToArray<T> = T extends any ? T[] : never;
type StringOrNumberArray = ToArray<string | number>;
// string[] | number[] (not (string | number)[])การใช้ infer เพื่อดึงชนิดข้อมูล
infer R จะประกาศตัวแปรชนิดข้อมูลที่ TypeScript เติมค่าให้ ซึ่งช่วยให้คุณจับส่วนต่าง ๆ ของโครงสร้างชนิดข้อมูลได้
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type Resolved = UnwrapPromise<Promise<string>>; // string
type Direct = UnwrapPromise<number>; // numberชนิดลิเทอรัลของแม่แบบ
ชนิดลิเทอรัลของแม่แบบใช้ไวยากรณ์แบ็กทิกแบบเดียวกับลิเทอรัลของแม่แบบ แต่ทำงานในระดับชนิดข้อมูล โดยสร้างชนิดยูเนียนจากชุดค่าผสมของลิเทอรัลสตริง
type Side = 'top' | 'right' | 'bottom' | 'left';
type PaddingKey = `padding-${Side}`;
// 'padding-top' | 'padding-right' | 'padding-bottom' | 'padding-left'
type EventName<T extends string> = `on${Capitalize<T>}`;
type ClickEvent = EventName<'click'>; // 'onClick'การรวมชนิดข้อมูลแบบแมปและแบบมีเงื่อนไข
รูปแบบ TypeScript ที่ทรงพลังที่สุดมักรวมทั้งสองแบบเข้าด้วยกัน ชนิดข้อมูล required, partial, readonly และ record ในตัวล้วนเป็นชนิดข้อมูลแบบแมป
// Make all functions in an object async:
type Asyncify<T> = {
[K in keyof T]: T[K] extends (...args: infer A) => infer R
? (...args: A) => Promise<R>
: T[K];
};ชนิดอรรถประโยชน์แบบเรียกซ้ำ DeepPartial
Partial ที่มีมาให้ในตัวทำงานลึกเพียงหนึ่งระดับเท่านั้น ส่วน DeepPartial จะเรียกซ้ำไปยังอ็อบเจ็กต์ที่ซ้อนอยู่ภายใน
type DeepPartial<T> = {
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};การใช้งานจริง: ชนิดข้อมูลการตอบกลับของ API
ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไขช่วยให้สร้างชนิดข้อมูลจาก API ได้อย่างทรงพลัง เช่น การดึงเฉพาะคุณสมบัติของอ็อบเจ็กต์ที่สามารถแปลงเป็น JSON ได้
หลีกเลี่ยงการออกแบบที่ซับซ้อนเกินจำเป็น
การใช้เทคนิคชนิดข้อมูลที่ซับซ้อนอาจทำให้โค้ดเข้าใจได้ยาก โปรดถามตัวเองเสมอว่า นามแฝงชนิดข้อมูลหรืออินเทอร์เฟซที่เรียบง่ายกว่าจะชัดเจนกว่าหรือไม่ ชนิดข้อมูลควรอธิบายเจตนาของโค้ด ไม่ใช่ใช้แสดงความเชี่ยวชาญด้าน TypeScript
ตรวจสอบอย่างรวดเร็ว
T extends U ? A : B ให้ผลลัพธ์เป็นอย่างไรเมื่อ T เป็นชนิดข้อมูลแบบยูเนียน
สรุป: ชนิดข้อมูลแบบแมปและมีเงื่อนไข
ชนิดข้อมูลแบบแมปจะวนซ้ำผ่านคีย์ด้วย [K in keyof T] ใช้ as เพื่อแมปคีย์ใหม่ คืนค่า never เพื่อกรอง ชนิดข้อมูลแบบมีเงื่อนไขคือ T extends U ? A : B ส่วน infer ใช้ดึงตัวแปรชนิดข้อมูล ชนิดข้อมูลแบบลิเทอรัลของแม่แบบใช้สร้างยูเนียนของสตริง คุณสามารถใช้ทั้งสองแบบร่วมกันเพื่อแปลงชนิดข้อมูลอย่างทรงพลัง เช่น DeepPartial และ Asyncify
คำถามที่พบบ่อย
บทเรียน “ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข”
สร้างชนิดข้อมูลแบบแมปเพื่อแปลงคุณสมบัติทั้งหมดของชนิดข้อมูล และใช้ชนิดข้อมูลแบบมีเงื่อนไขร่วมกับ infer เพื่อเขียนตรรกะระดับชนิดข้อมูลขั้นสูง คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม
ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Generics: T, extends และข้อจำกัด
- ชนิดข้อมูลอรรถประโยชน์: Partial, Required, Pick และ Omit
- ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข
- การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก