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

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

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

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

  1. Generics: T, extends และข้อจำกัด
  2. ชนิดข้อมูลอรรถประโยชน์: Partial, Required, Pick และ Omit
  3. ชนิดข้อมูลแบบแมปและชนิดข้อมูลแบบมีเงื่อนไข
  4. การทำให้ชนิดข้อมูลแคบลง: typeof, instanceof และยูเนียนแบบจำแนก
← กลับไปที่ Frontend Academy