الدوال العامة
Generic Functions
الدوال العامة — Generic Functions
Generic يعني أن الدالة تعمل مع أكثر من نوع، لكنها لا تنسى النوع. مثال identity<T>(value: T): T يستقبل قيمة من نوع ما ويرجع النوع نفسه. لو مررت string، يرجع string. لو مررت number، يرجع number. هذا أفضل من any لأن any ينسى كل شيء.
لا تستخدم generics لمجرد أنها تبدو متقدمة. إذا كانت الدالة تعمل فقط مع number، اكتب number. استخدم generic عندما توجد علاقة بين المدخل والمخرج أو بين أكثر من معامل.
مثال عملي
الدالة first لا تعرف نوع العناصر مسبقاً، لكنها تحافظ عليه. وترجع undefined لأن القائمة قد تكون فارغة.
noUncheckedIndexedAccess
بدون noUncheckedIndexedAccess في tsconfig، TypeScript يُخبرك أن items[0] من نوع T — وليس T | undefined — حتى لو كانت القائمة فارغة. هذا خطير:
// بدون noUncheckedIndexedAccess: TypeScript يقول number — لكن قد يكون undefined!
const scores: number[] = [];
const first = scores[0]; // number? لا، undefined فعلاً
// مع noUncheckedIndexedAccess في tsconfig: TypeScript يقول number | undefined ✓
لهذا كتبنا first<T> بنوع إرجاع T | undefined صراحةً. هذا النمط يحمي المستدعي دون الحاجة لتفعيل noUncheckedIndexedAccess. في production، يُوصى بتفعيله لالتقاط فئة كاملة من الأخطاء تلقائياً.
T ليس اسماً مقدساً
يمكن استخدام أسماء أوضح مثل Item أو Value، خصوصاً عندما يوجد أكثر من generic.