قبل از اینکه وارد مفهوم پارامترها و توابع دوسویه بشم، باید اول چندتا مفهوم رو توضیح بدم. مفاهیمی که به جنریکها و ماهیت ریاضیاتی توابع مربوط میشن.
اگر درمورد جنریکها نمیدونین، پیشنهاد میکنم که این مطلب امیررضا رو حتما بخونید. لازم هست که قبل از اینکه وارد این موضوع بشید، حتما در مورد جنریکها آگاهی داشته باشید.
کوواریانس یا Covariance در واقع به وراثت برمیگرده. با یک مثال توضیح میدم، اگر تایپ B از A مشتق شده باشه، یعنی B وارث A هست یا به یه شکل دیگه، A کلاس پایهی B محسوب میشه. در نتیجه B تمام متدها و پراپرتیهای A رو توی خودش داره.
تو این حالت، میشه گفت که B از A بزرگتره. این ایده که B از A بزرگتره، یک ایدهی خیلی مهمه!
بذارید یکم ریاضیاتیتر توضیح بدم، اگر B از A مشتق میشه، پس میشه گفت A>B (من به جهت فلش خیلی دقت کردم، دقیقا درسته) و B هر آنچه که A داره رو توی خودش داره. حالا چون B همهی چیزهای A رو داره، ما میتونیم هرجا که از A استفاده شده، از B هم استفاده کنیم. گرچه این ارتباط اصطلاحا یکطرفه یا Asymmertical محسوب میشه. این ارتباط به عنوان اصل تعویض لیسکوف یا Liskov Substitution Principle هم شناخته میشه.
حالا بیاید ببینیم که این قائده چطور روی توابع هم استفاده میشه.
اگه ما یک فانکشن رو تعریف کنیم که شیئی از جنس A رو به عنوان ورودی دریافت کنه، و شیئی از جنس B رو خارج کنه، یا در واقع:
f(A) -> B and A>B
برقرار باشه، طبق همین قانون ما میتونیم به عنوان ورودی تابع شیئی از جنس B رو بدیم، و شیئی از جنس B هم دریافت کنیم. در واقع میشه گفت که f(B)
جایزه. میشه نوشت:
class A {} class B extends A {} function f(p: A): B { return new B() } let myA: A = f(new B())
به این معنی که اگه A>B پارامتر ورودی A میتونه B هم باشه چون هرچی که A داره رو اون هم داره. پس با همین تعریف میشه گفت که پارامترهای ورودی کنتراواریانت یا Contravariant هستن و پارامترهای خروجی، کوواریانت یا Covariant.
حالا بریم یکم در مورد زبان تایپاسکریپ و یکی از ویژگیهای کمتر شناخته شدهی اون صحبت کنیم، strictFunctionTypes
! این آرگومان که میشه به کامپایلر پاس داد، به شما کمک میکنه که نوع دیگهای از باگها رو شناسایی کنید و جلوشون رو بیگیرید.
برای ادامه مطلب میتونید به سایت خودم مراجعه کنید :) اونجا توضیحات بیشتری در این رابطه میدم.
با آرزوی موفقیت