spinny:~/writing $ less advanced-typescript-patterns.md
12TypeScript ได้กลายเป็นมาตรฐานอุตสาหกรรมสำหรับการพัฒนาเว็บขนาดใหญ่ แม้ว่านักพัฒนาส่วนใหญ่จะรู้พื้นฐานของ interface และ type แต่พลังที่แท้จริงอยู่ในระบบ type ขั้นสูง นี่คือ 5 รูปแบบที่จะทำให้คุณโดดเด่นในฐานะวิศวกรอาวุโส34## 1. Generic Constraints56Generics มีพลังมาก แต่บางครั้งคุณต้องจำกัดสิ่งที่สามารถส่งเข้ามาได้ `extends` คือเพื่อนของคุณที่นี่78```typescript9interface HasId {10 id: string;11}1213function getById<T extends HasId>(list: T[], id: string): T | undefined {14 return list.find((item) => item.id === id);15}16```1718โดยการรับประกันว่า `T` ขยาย `HasId` เราจึงมั่นใจได้ว่าการเข้าถึง `.id` ภายในฟังก์ชันนั้นปลอดภัย1920## 2. Conditional Types2122Conditional types ช่วยให้คุณสร้างการแมป type ที่ไม่สม่ำเสมอได้ ไวยากรณ์คล้ายกับตัวดำเนินการ ternary ใน JavaScript2324```typescript25type IsString<T> = T extends string ? true : false;2627type A = IsString<string>; // true28type B = IsString<number>; // false29```3031กรณีใช้งานจริงคือการกรอง type จาก union:3233```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```3738## 3. Mapped Types3940Mapped types ช่วยให้คุณสร้าง type ใหม่จาก type เดิมโดยการแปลงคุณสมบัติ4142```typescript43type ReadOnly<T> = {44 readonly [P in keyof T]: T[P];45};4647interface User {48 name: string;49 age: number;50}5152type ReadOnlyUser = ReadOnly<User>;53```5455คุณยังสามารถเพิ่มหรือลบ modifier ได้:5657```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```6263## 4. Template Literal Types6465เปิดตัวใน TypeScript 4.1 ช่วยให้คุณจัดการกับ string type ได้โดยตรง6667```typescript68type World = 'world';69type Greeting = `hello ${World}`; // "hello world"7071type Color = 'red' | 'blue';72type Quantity = 'light' | 'dark';7374type Palette = `${Quantity}-${Color}`;75// "light-red" | "light-blue" | "dark-red" | "dark-blue"76```7778สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการกำหนด type ให้กับสตริงที่เป็นไปตามรูปแบบเฉพาะ เช่น คลาส CSS หรือชื่อเหตุการณ์7980## 5. คีย์เวิร์ด `infer`8182คีย์เวิร์ด `infer` ภายใน conditional types ช่วยให้คุณแยก type จาก type อื่นได้8384```typescript85type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;8687function check(): boolean {88 return true;89}9091type CheckReturn = ReturnType<typeof check>; // boolean92```9394ที่นี่ เรากำลังขอให้ TypeScript "อนุมาน" ประเภทค่าส่งกลับ `R` ของฟังก์ชันและส่งคืนมัน9596## สรุป9798การเชี่ยวชาญรูปแบบเหล่านี้ช่วยให้คุณเขียนไลบรารีและยูทิลิตี้ที่แข็งแกร่งและมอบประสบการณ์นักพัฒนา (DX) ที่ยอดเยี่ยม เป้าหมายของ TypeScript ขั้นสูงไม่ใช่ความซับซ้อนเพื่อความซับซ้อน แต่เป็นความปลอดภัยและความสามารถในการแสดงออก99
:5 รูปแบบ TypeScript ขั้นสูงสำหรับวิศวกรอาวุโสlines 1-99 (END) — press q to close