spinny:~/writing $ less advanced-typescript-patterns.md
12أصبحت TypeScript معيار الصناعة لتطوير الويب على نطاق واسع. بينما يعرف معظم المطورين أساسيات الواجهات والأنواع، تكمن القوة الحقيقية في نظام الأنواع المتقدم الخاص بها. إليك 5 أنماط ستميزك كمهندس كبير.34## 1. القيود العامة (Generic Constraints)56العموميات قوية، لكن في بعض الأحيان تحتاج إلى تقييد ما يمكن تمريره. `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 Types)2122تسمح لك الأنواع الشرطية بإنشاء تعيينات أنواع غير موحدة. بناء الجملة مشابه للمشغل الثلاثي في JavaScript.2324```typescript25type IsString<T> = T extends string ? true : false;2627type A = IsString<string>; // true28type B = IsString<number>; // false29```3031حالة استخدام عملية هي تصفية الأنواع من اتحاد:3233```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```3738## 3. الأنواع المعينة (Mapped Types)3940تسمح لك الأنواع المعينة بإنشاء أنواع جديدة بناءً على الأنواع القديمة عن طريق تحويل الخصائص.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يمكنك حتى إضافة أو إزالة المعدلات:5657```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```6263## 4. أنواع القوالب الحرفية (Template Literal Types)6465تم تقديم هذه في TypeScript 4.1، وهي تسمح لك بمعالجة أنواع السلاسل مباشرة.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هذا مفيد بشكل لا يصدق لكتابة السلاسل التي تتبع نمطًا معينًا، مثل فئات CSS أو أسماء الأحداث.7980## 5. الكلمة الأساسية `infer`8182تسمح لك الكلمة الأساسية `infer` داخل الأنواع الشرطية باستخراج الأنواع من أنواع أخرى.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