TypeScript ได้กลายเป็นมาตรฐานอุตสาหกรรมสำหรับการพัฒนาเว็บขนาดใหญ่ แม้ว่านักพัฒนาส่วนใหญ่จะรู้พื้นฐานของ interface และ type แต่พลังที่แท้จริงอยู่ในระบบ type ขั้นสูง นี่คือ 5 รูปแบบที่จะทำให้คุณโดดเด่นในฐานะวิศวกรอาวุโส
1. Generic Constraints
Generics มีพลังมาก แต่บางครั้งคุณต้องจำกัดสิ่งที่สามารถส่งเข้ามาได้ extends คือเพื่อนของคุณที่นี่
interface HasId { id: string; } function getById<T extends HasId>(list: T[], id: string): T | undefined { return list.find((item) => item.id === id); }
โดยการรับประกันว่า T ขยาย HasId เราจึงมั่นใจได้ว่าการเข้าถึง .id ภายในฟังก์ชันนั้นปลอดภัย
2. Conditional Types
Conditional types ช่วยให้คุณสร้างการแมป type ที่ไม่สม่ำเสมอได้ ไวยากรณ์คล้ายกับตัวดำเนินการ ternary ใน JavaScript
type IsString<T> = T extends string ? true : false; type A = IsString<string>; // true type B = IsString<number>; // false
กรณีใช้งานจริงคือการกรอง type จาก union:
type Diff<T, U> = T extends U ? never : T; type NonNullable<T> = Diff<T, null | undefined>;
3. Mapped Types
Mapped types ช่วยให้คุณสร้าง type ใหม่จาก type เดิมโดยการแปลงคุณสมบัติ
type ReadOnly<T> = { readonly [P in keyof T]: T[P]; }; interface User { name: string; age: number; } type ReadOnlyUser = ReadOnly<User>;
คุณยังสามารถเพิ่มหรือลบ modifier ได้:
type Mutable<T> = { -readonly [P in keyof T]: T[P]; };
4. Template Literal Types
เปิดตัวใน TypeScript 4.1 ช่วยให้คุณจัดการกับ string type ได้โดยตรง
type World = 'world'; type Greeting = `hello ${World}`; // "hello world" type Color = 'red' | 'blue'; type Quantity = 'light' | 'dark'; type Palette = `${Quantity}-${Color}`; // "light-red" | "light-blue" | "dark-red" | "dark-blue"
สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการกำหนด type ให้กับสตริงที่เป็นไปตามรูปแบบเฉพาะ เช่น คลาส CSS หรือชื่อเหตุการณ์
5. คีย์เวิร์ด infer
คีย์เวิร์ด infer ภายใน conditional types ช่วยให้คุณแยก type จาก type อื่นได้
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; function check(): boolean { return true; } type CheckReturn = ReturnType<typeof check>; // boolean
ที่นี่ เรากำลังขอให้ TypeScript "อนุมาน" ประเภทค่าส่งกลับ R ของฟังก์ชันและส่งคืนมัน
สรุป
การเชี่ยวชาญรูปแบบเหล่านี้ช่วยให้คุณเขียนไลบรารีและยูทิลิตี้ที่แข็งแกร่งและมอบประสบการณ์นักพัฒนา (DX) ที่ยอดเยี่ยม เป้าหมายของ TypeScript ขั้นสูงไม่ใช่ความซับซ้อนเพื่อความซับซ้อน แต่เป็นความปลอดภัยและความสามารถในการแสดงออก