زبان (سوپرست) typescript یک زبان حاوی تایپ است. اما تعریف تایپ برای همه متغیرها الزامی نیست. زمانی که تایپ یک متغیر مشخص نشده باشد، با اولین مقدار assign شده، تایپ متغیر بر اساس همان مقدار مشخص میشود. مثلا:
در این حالت اولین مقداری که به متغیر title پاس داده شده است از نوع string است . بنابراین تایپ متغیر title از نوع string در نظر گرفته میشود و در مقداردهی های بعدی کنترل میشود.
به طور کلی type inference در زمانی اتفاق می افتد که اولین بار:
مثال زیر رو با هم مرور کنیم:
متغیر a برای اولین بار با یک مقدار string مقداردهی شده و تایپ string برای آن در نظر گرفته میشود. متغیر b هم با یک عدد مقداردهی شده و تایپ number برای آن در نظر گرفته میشود. زمانی که میخواهیم مقدار b را به a بدهیم، خطای یکسان نبودن تایپ ها توسط کامپایلر اعلام میشود.
ممکن است یک آبجکت با ساختار داده ای مقداردهی شود که حاوی متغیرهایی با تایپ های متفاوت است. برای مثال:
در این حالت typescript عمومی ترین تایپی را در نظر میگیرد که بر اساس مقدار assign شده میتوان به متغیر نسبت داد. مثلا در مثال بالا تایپ زیر در نظر گرفته میشود:
بنابر این از این به بعد به این آرایه میتوان مقدارهای عدد و null اضافه کرد:
همین قضیه در مورد مقدار خروجی توابع هم هست. اولین بار که یک تابع مقدار خروجی خود را برگرداند، چنانچه تایپ خروجی تابع مشخص نشده باشد، تایپ اسکریپت عمومی ترین تایپ را بر اساس مقدار خروجی، برای تابع در نظر میگیرد و دفعات بعد همان تایپ را کنترل میکند. مثال زیر گویای مطلب است:
در مثال بالا مقادیر ورودی مشخص شده اند اما مقدار خروجی تابع مشخص نشده است. بار اول که عدد 30 به عنوان خروجی تابع برگردانده میشود، تایپ خروجی تابع برابر با number در نظر گرفته میشود. دیگر نمیتوان خروجی این تابع را به متغیری با تایپ string پاس داد.
انتخاب بهترین تایپ همیشه به این راحتی نیست. به مثال زیر توجه کنید:
تایپی که برای متغیر zoo بر نظر گرفته میشود برابر با مقدار زیر است:
چون compiler تایپ دیگری نمی بیند. ولی شاید انتخاب تایپ زیر برای zoo بهتر باشد، تا بتوانیم در آینده تایپ های متنوع تری را به آرایه بیافزاییم.
بنابر این در چنین حالتی خودمان تایپ مربوط به متغیر را صراحتا (explicit) مشخص میکنیم.
بعضی مواقع تایپ متغیر بر اساس شرایطی که در آن قرار دارد مشخص میشود. مثلا:
در مثال بالا، یک تابع به اختصاص داده شده است. تابع پارامتری دارد که تایپ آن نامشخص است. اما از قبل تعریف شده و تایپ پارامتر ورودی تابع آن، مشخص شده است. بنابر این کامپایلر متوجه میشود که این پارامتر ورودی نامشخص، طبق تعریف از چه جنسی است ( در اینجا mouseEvent ). بنابر این button property دارد ولی متغیری بنام kangaroo داخل آن تعریف نشده است.
مثال زیر را هم در نظر بگیریم:
سناریوی این مثال هم مانند مثال بالاست. کامپایلر تایپ نامشخص پارامتر ورودی تابع را، بر اساس تایپ از پیش مشخص شده در ، مشخص میکند. میفهمد اینجا پارامتر ورودی از جنس UIEvent است و این نوع Event متغیری بنام button درون خود ندارد.
نتیجه
در این مقاله با مفهوم type inference یا استنباط تایپ متغیر در کامپایلر آشنا شدیم. متوجه شدیم بعضی مواقع بهتر است به صورت صریح (explicit) خودمان تایپ متغیر را مشخص کنیم تا در ادامه برنامه به مشکل بر نخوریم. همچنین مروری داشتیم به انتخاب تایپ متغیر بر اساس context مربوط به آن.
موفق باشید :)