إرجاع نوع جنيريك في TypeScript يمتد من نوع أساسي
عند العمل مع TypeScript، قد يواجه المطورون بعض التعقيدات المتعلقة بأنواع البيانات، خاصة عندما نتحدث عن الأنواع العامة التي تمتد إلى نوع أساسي. تتواجد العديد من الأسئلة الشائعة حول كيفية التعامل مع هذا الأمر، وفي هذا المقال، سنسلط الضوء على كيفية إنشاء نوع بيانات عام بإرجاع نوع يمتد إلى نوع أساسي في TypeScript.
ما هو أنواع البيانات العامة في TypeScript؟
تعتبر الأنواع العامة في TypeScript من الخصائص القوية التي تتيح للمطورين إنشاء وظائف ونماذج بيانات مرنة وقابلة لإعادة الاستخدام. يسمح استخدام الأنواع العامة بإنشاء وظائف تستقبل أو تعيد أنواعًا مختلفة، مما يسهل التفاعل مع البيانات بشكل أكثر ديناميكية.
فهم سبب ظهور الخطأ TS2322
لنبدأ بتحليل الوضع الذي يسبب ظهور الخطأ TS2322 في الكود. دعونا نفترض أن لدينا نوع أساسي يسمى BaseResponse
الغني بالبيانات، حيث يحتوي على خاصية a
من نوع number. بعد ذلك، نقوم بإنشاء نوع ممتد يسمى ExtendedResponse
الذي يجمع بين BaseResponse
ولكن بإضافة خاصية جديدة b
من نوع string.
ثم نقوم بتعريف دالة Fn
التي تعيد نوع بيانات عام يسمى T
. في هذا السياق، يبدو أن الدالة fn
التي نستخدمها في مصفوفة arr
تحاول إرجاع كائن يتماشى مع BaseResponse
. ولكن هنا يأتي ظهور الخطأ – حيث يتوقع TypeScript نوعاً عاماً، مقيداً بنوع T
الذي قد يكون نوع فرعي أوسع من BaseResponse
.
التفاعل بين الأنواع العامة والنوع الأساسي
عندما يتم تعريف عنصر في مصفوفة من النوع A
، يجب أن تلتزم نتيجة دالة fn
بالتوقيع المحدد لـ T
. ولكن إذا كان T
قد يُعرّف كنوع فرعي آخر من BaseResponse
، فإن الكود سيكون غير متوافق، مما يؤدي إلى الخطأ المذكور. على سبيل المثال، إذا كان لدينا كائن يتم إرجاعه من الدالة fn
يحتوي فقط على خاصية a
، لن يتناسب هذا مع متطلبات T
، لأنه يمكن أن يُتوقع أن يحتوي T
على المزيد من الخصائص.
التعامل مع الأنواع العامة في TypeScript
لحل هذه المشكلة، يمكننا التفكير في تحديد نوع بيانات T
بشكل أفضل، بحيث يتضمن قيودًا معينة تسمح بالامتثال لكل من BaseResponse
و ExtendedResponse
. يمكننا استخدام الأنواع العامة مع قيود محسوبة، بحيث نسمح بـ BaseResponse
مع قابلية التوسع للإضافة في النتائج.
نموذج عملي لنوع إرجاع عام يمتد لنوع أساسي
دعونا نرى مثالاً على كيفية العمل مع ذلك. يمكننا تعريف دالة تأخذ نوعًا عامًا وتعيد نوعًا يعتمد على هذا النوع، مع التأكيد على أنه يمتد من BaseResponse
. كما يمكننا استخدام الدالة كالتالي:
type BaseResponse = { a: number };
type ExtendedResponse = BaseResponse & { b: string };
type Fn<T extends BaseResponse> = () => T;
interface A<T extends BaseResponse> {
fn: Fn<T>;
}
const arr: A<ExtendedResponse>[] = [{
fn: () => {
return {
a: 4,
b: 'test'
};
}
}];
في هذا النموذج، نرى كيف يمكن استخدام الأنواع العامة لضمان أن كائناتنا تتماشى مع التوقعات المحددة.
الخلاصة
يمكننا القول إن العمل مع الأنواع العامة التي تمتد إلى نوع أساسي في TypeScript يوفر مرونة قوية ولكنه يأتي مع بعض التحديات. من المهم فهم كيفية عمل هذه الأنواع وكيفية التعامل مع القيود المناسبة. عند استخدام الأنواع العامة بشكل صحيح، يمكن تحسين التصميم للكود الخاص بك وزيادة كفاءة صيانته. من خلال فهم الأخطاء مثل TS2322، يمكنك التوجه نحو كتابة كود أكثر دقة وتنظيمًا.