مبحث Generics در تایپ اسکریپت به زبان ساده

این ابزار ،یعنی Generic، یکی از ابزار های قدرتمند تایپ اسکریپت است. من قصد دارم که در ابتدا با یک مثال مشکلی رو مطرح کنم که به وسیله‌ی Generic قابل حل هست تا متوجه شویم که چرا باید از این قابلیت استفاده کنیم و در ادامه به توضیح کامل آن خواهم پرداخت. امیدوارم که در پایان مقاله این مبحث رو به طور کامل متوجه شده باشید.منبع من برای توضیح این مبحث کتاب Programming TypeScript می‌باشد.مثالتصور کنید که تابعی برای فیلتر کردن یک آرایه نوشته‌اید. شکل آن به صورت زیر است :همانطور که از کد این تابع پیداست، تابع ما یک آرایه را می‌گیرد و روی آن حلقه می‌زند و در نهایت آرایه‌ی فیلتر شده را برمی‌گرداند. به طور مثال :تا اینجای کار که تنها با جاوااسکریپت سر و کار داشتیم و چیز تایپ اسکریپتی‌ای در کار نبود.حال تصور کنید که می‌خواهیم یک type کاستوم مخصوص این تابع درست کنیم که در آن نوع ورودی ها و خروجی تابع را مشخص کنیم (بالاخره برای همین داریم از تایپ اسکریپت استفاده می‌کنیم دیگه) :در ابتدا به عنوان تایپ ورودی ها و خروجی تابع، تایپ number را می‌نویسیم که به این معناست: تابع ما تنها می‌تواند آرایه‌ای از اعداد را دریافت و فیلتر کند. ولی خب مگه ما همیشه با آرایه‌ای از اعداد سر و کار داریم؟ممکنه لازم داشته باشیم آرایه‌ای از رشته ها(string) و یا آبجکت ها(object) رو فیلتر کنیم. خب اولین چیزی که به ذهنمون می‌رسه اینه که بقیه حالات ممکن رو هم به type کاستوم خودمون اضافه کنیم :تا اینجا همه چیز بنظر درست میرسه.(با صرف نظر از اینکه اگه حالات ممکن یک تابع بیشتر بشه، اضافه کردنشون یک کار اضافی و طاقت فرساست) مشکلپس بیایم یکبار دیگه از تابع استفاده بکنیم، ولی این دفعه با آرایه‌ای از آبجکت ها :همونطور که می‌بینید ارور گرفتیم. متن ارور هم میگه که اصلا چیزی به اسم firstName در آبجکت ما وجود نداره. در صورتی که وجود داره مگه نه؟دلیلمشکل از اونجایی شروع میشه که وقتی ما حالات ممکن رو برای type کاستوم خودمون تعریف کردیم، در حالت آخر اشاره کردیم که ورودی ها و خروجی تابع ما آرایه‌ای از آبجکت هاست.ولی باید دقت کنیم که هیچ جزییات دیگه‌ای رو نگفتیم. خود تایپ اسکریپت هم دقت نمیکنه که درون آبجکت های ما چه مقادیری وجود داره و فقط و فقط میدونه که قراره تابع ما صرفا یک آبجکت رو دریافت کنه.برای همین هست که وقتی میخواد به مقدار firstName دسترسی پیدا کنه نمیتونه، چون اصلا خبر نداره داخل آبجکت ما چه چیزی هست.راه حلخب باید چیکار کنیم؟ اینجاست که Generic ها وارد عمل میشن. بیایم type کاستوم خودمون رو به شکل زیر بازنویسی کنیم :حالا این چه معنی میده؟چیزی که الان نوشتیم به این معناست : ما یک تابع داریم که تایپ ورودی هاش و خروجیش پارامتر T هست. T یک تایپ مشخص نیست و ما تشخیص تایپ رو به عهده خود تایپ اسکریپت میزاریم. یعنی هر بار که از تابع استفاده می‌کنیم، خود تایپ اسکریپت می‌فهمه که چه تایپی از آرایه رو بهش دادیم و اون رو جای تمام T هایی میزاره که در تصویر بالا می‌بینید.مثلا در مثال اول همین مقاله که آرایه‌ای از اعداد رو به تابع دادیم، خود تایپ اسکریپت تایپ number رو تشخیص میده و جای تمام T ها در عکس بالا number رو قرار میده.البته دقت کنید که اسم T یک اسم اختیاری است و شما میتونید جای حرف T هر حرفی که دوست دارید رو قرار بدید. حرف T صرفا یک قرارداد برای نام گذاری پارامتر های Generic هست.مزیتخب حالا چه فرقی کرد؟ این کاری که الان کردیم 2 تا مزیت داره :دیگه لازم نیست برای توابعی که ممکنه چندین نوع از ورودی رو دریافت کنن تمام حالاتشون رو خودمون به صورت دستی بنویسیم. از Generic ها استفاده می‌کنیم و اجازه میدیم که خود تایپ اسکریپت نوع ورودی رو بفهمه.مزیت مهم تر این هست که دیگه وقتی از آبجکت ها استفاده می‌کنیم، تایپ اسکریپت دقیقا می‌دونه داخل آبجکت های ما چه خبره و چه مقادیری رو دارن. پس در مثال بالاتر که ارور گرفتیم، دیگه برای دسترسی به مقدار firstName اروری رو دریافت نخواهیم کرد.جمع بندیامیدوارم که این بحث رو کامل متوجه شده باشید و تونسته باشم مفهوم رو به خوبی برسونم. البته این بحث کمی گسترده تر هست و کاربرد ها و حالات دیگه‌ای هم براش وجود داره که امیدوارم بتونم اونارو هم در پست های بعدی به طور کامل توضیح بدم.