قبل از توضیح Predicate را تایپ کنید، بذارید بگم که تی اس چجوری کار میکنه. بریم از زبون خود تی اس بشنویم 🙂

« اگر تایپ کنیدهاتون رو برای من(TS) مشخص کنین، من خودم در ادامه براتون تایپ کنید بررسی انجام میدم و موقع اختصاص دادن‌ها و ازین گونه موارد، میتونم نوع هارو تشخیص بدم. اما شما اگر خودتون بخواهید عمل شید و یجاهایی خودتون را به صورت سفارشی توی توییتر نوع برنامه ها رو تغییر بدید یا اصطلاحا type cast انجام بدید، من به شما به عنوان یه توسعه دهنده اعتماد میکنم و تایپ کنید که شما تعیین میکنید اولویت داره برای من »

خب داستان چیه که TS انقد داره حال میده بهمون ؟ یعنی چی؟ این مثال رو ببینید

اینجا اومدیم یک مقدار از جنس شماره رو ریختیم توی یه تغییر از جنس رشته که خب طبیعتا هم TS بهمون گیر میده.د ولی اگه نوع cast انجام بدیم و بهش بگیم که این مقدار 20 که داریم بهت اختصاص می دهیم در واقع رشته هست، TS میگه اوکی. و حرف ما براش سند هستش.

همونطور که میبینین، با تایپ cast ی که انجام دادیم، TS قبول کرد که مقداری از نوع رشته هستش و متدهای رشته رو میتونیم روش صدا بزنیم. چون اگه مستقیما میخواستیم نوع cast رو از عدد به رشته انجام بدیم، TS اجازه نمیداد و میگفت این دوتا رو با هم دیگه همپوشانی ندارن یا اصطلاحا همدیگه رو overlap نمیکنن ک بخوای castشون کنی).

مثالی که زدم فقط برای توضیح عملکرد TS بود و خب شما قاعدتا نباید این کارو بکنید چون توی Runtime به ارور میخورید.

حالا ازین قضیه میخوایم توی بحث از نوع محمول استفاده کنیم. ممکنه با عنوان محافظ نوع هم بهش اشاره شود. در واقع نوع محمول یکی از فیچرای مبحث باریک شدن توی TS هست که پیشنهاد میکنم در موردش یه سرچ بزنید.

اول این رابطی که تعریف کردم رو در نظر بگیرید.

توضیح لازم نداره، فقط اومدم دوتا رابط تعریف کردم که از Animal ارث بری میکنن و آرتیبیوت خاص خودشون رو دارن. حالا مثلا من میخوام یجایی چک کنم که آبجکتی دارم که دارم کار کنم از نوع Bird هست یا نه و اگر هست متد fly رو صدا بزنم روش. من فقط میدونم که آبجکتم یعنی حتما از نوع Animal هست رابطی که برای Animal تعریف کردم رو رضا میکنه. خب میام خیلی راحت وجود تریبیوت fly رو چک میکنم.

عه؟! ارور داد که. خب معلومه دیگه بهت اجازه نمیده که روی یک آبجکت از نوع Animal این متد رو صدا بزنی. از طرفی من مطمئن بودم که آبجکت من از نوع Bird هست که اصلا اصلا چک نمیکردم. راه حل چیه؟ محمولات را تایپ کنید

میام با استفاده از نوع casting یه فانکشن isBird تعریف میکنم که خروجی اون یک مقدار boolean هست.

خب میبینیم که بهمون اجازه داد که متد fly رو صدا بزنیم. یعنی TS فهمید که در این صورت حتما تریبیوت fly روی اون آبجکت وجود داره. Animal is Bird در واقع یعنی خروجی تابع ما بیان می کند که این آبجکت از نوع Bird هست یا خیر که در واقع boolean ه. حالا این فقط یه مثال بود. خیلی جاها ما أصلا نمیدونیم نوع آبجکتمون چی هستش. جدا ازون این کد مشکل نگهداری هم داره یعنی پس فردا اگه اتریبیوت fly عوض شد باید بیایم تابع رو تغییر بدیم. پس میام یه تابع کلی تر و بهتر مینویسیم.

خب خیلی خوب شد. fullFillsType در واقع یک نوع پارامتر میگیره به پارامتر همراهی obj و attr که به ما میگه که اگر این obj از نوع T باشه، آیا تریبیوتِ attr رو داخل خودش داره یا نه. توجه کنید که attr باید از بین کلیدهای انتخاب شود. حالا هرجا خواستیم ببینیم که یک آبجکت یک نوع رو روی یک اتریبیوت خاص ارضا میکنه یا نه میتونیم از این تابع استفاده کنیم. به دلیل اینکه attr رو از بین کلید های T انتخاب کنید، اگر این کد رو داخل ادیتورتون بزنید، میبینید که موقعی که میخاید تابع رو صدا بزنید و دوم رو بهش پاس بدید، TS خودش لیست موجود کلید های نوعتون رو بهتون نشون میده.

فیچرهای تی اس رو دست کم نگیرید. پیشنهاد میکنم داکیومنت TS رو خط به خط بخونید و باهاش ​​پیش برید. فیچرها به شدت کاربردی‌ها و اطلاع نداشتن از اونا ممکن است در روند توسعه سرعتتون رو کم بکنه و پیچیدگی کدتون زیاد شود.

اگر فیدبک، انتقاد، پیشنهاد یا هرچیز دیگه ای مدنظرتون هست خیلی ممنون میشم ازتون که برام کامنت کنین یا بهم پیام بدین

لینکدین: https://www.linkedin.com/in/sajjad-rahimi-890851231/

تلگرام: @sajjrhm

اگر دوست داشتی امتیاز دادن یادت نره!