رهام رفیعی تهرانی
رهام رفیعی تهرانی
خواندن ۳ دقیقه·۱ سال پیش

بررسی ویژگی type inference در typescript


عملکرد type inference ( استنباط type ) چیست؟

زبان (سوپرست) typescript یک زبان حاوی تایپ است. اما تعریف تایپ برای همه متغیرها الزامی نیست. زمانی که تایپ یک متغیر مشخص نشده باشد، با اولین مقدار assign شده، تایپ متغیر بر اساس همان مقدار مشخص میشود. مثلا:

در این حالت اولین مقداری که به متغیر title پاس داده شده است از نوع string است . بنابراین تایپ متغیر title از نوع string در نظر گرفته میشود و در مقداردهی های بعدی کنترل میشود.


به طور کلی type inference در زمانی اتفاق می افتد که اولین بار:

  • متغیر مقداردهی میشود.
  • مقدار پیشفرض پارامتر ورودی مشخص میشود.
  • مقدار خروجی تابع مشخص میشود.


مثال زیر رو با هم مرور کنیم:


متغیر a برای اولین بار با یک مقدار string مقداردهی شده و تایپ string برای آن در نظر گرفته میشود. متغیر b هم با یک عدد مقداردهی شده و تایپ number برای آن در نظر گرفته میشود. زمانی که میخواهیم مقدار b را به a بدهیم، خطای یکسان نبودن تایپ ها توسط کامپایلر اعلام میشود.


عملکرد type inference در آبجکت های پیچیده

ممکن است یک آبجکت با ساختار داده ای مقداردهی شود که حاوی متغیرهایی با تایپ های متفاوت است. برای مثال:

در این حالت typescript عمومی ترین تایپی را در نظر میگیرد که بر اساس مقدار assign شده میتوان به متغیر نسبت داد. مثلا در مثال بالا تایپ زیر در نظر گرفته میشود:

بنابر این از این به بعد به این آرایه میتوان مقدارهای عدد و null اضافه کرد:

در صورتی که مقداری از نوع string به آرایه ارسال شود، کامپایلر خطا می دهد.
در صورتی که مقداری از نوع string به آرایه ارسال شود، کامپایلر خطا می دهد.


همین قضیه در مورد مقدار خروجی توابع هم هست. اولین بار که یک تابع مقدار خروجی خود را برگرداند، چنانچه تایپ خروجی تابع مشخص نشده باشد، تایپ اسکریپت عمومی ترین تایپ را بر اساس مقدار خروجی، برای تابع در نظر میگیرد و دفعات بعد همان تایپ را کنترل میکند. مثال زیر گویای مطلب است:

در مثال بالا مقادیر ورودی مشخص شده اند اما مقدار خروجی تابع مشخص نشده است. بار اول که عدد 30 به عنوان خروجی تابع برگردانده میشود، تایپ خروجی تابع برابر با number در نظر گرفته میشود. دیگر نمیتوان خروجی این تابع را به متغیری با تایپ string پاس داد.


بهترین تایپ متغیر

انتخاب بهترین تایپ همیشه به این راحتی نیست. به مثال زیر توجه کنید:

تایپی که برای متغیر zoo بر نظر گرفته میشود برابر با مقدار زیر است:

چون compiler تایپ دیگری نمی بیند. ولی شاید انتخاب تایپ زیر برای zoo بهتر باشد، تا بتوانیم در آینده تایپ های متنوع تری را به آرایه بیافزاییم.

بنابر این در چنین حالتی خودمان تایپ مربوط به متغیر را صراحتا (explicit) مشخص میکنیم.


انتخاب تایپ بر اساس context یا همان Contextual Typing

بعضی مواقع تایپ متغیر بر اساس شرایطی که در آن قرار دارد مشخص میشود. مثلا:

در مثال بالا، یک تابع به اختصاص داده شده است. تابع پارامتری دارد که تایپ آن نامشخص است. اما از قبل تعریف شده و تایپ پارامتر ورودی تابع آن، مشخص شده است. بنابر این کامپایلر متوجه میشود که این پارامتر ورودی نامشخص، طبق تعریف از چه جنسی است ( در اینجا mouseEvent ). بنابر این button property دارد ولی متغیری بنام kangaroo داخل آن تعریف نشده است.

مثال زیر را هم در نظر بگیریم:

سناریوی این مثال هم مانند مثال بالاست. کامپایلر تایپ نامشخص پارامتر ورودی تابع را، بر اساس تایپ از پیش مشخص شده در ، مشخص میکند. میفهمد اینجا پارامتر ورودی از جنس UIEvent است و این نوع Event متغیری بنام button درون خود ندارد.


نتیجه

در این مقاله با مفهوم type inference یا استنباط تایپ متغیر در کامپایلر آشنا شدیم. متوجه شدیم بعضی مواقع بهتر است به صورت صریح (explicit) خودمان تایپ متغیر را مشخص کنیم تا در ادامه برنامه به مشکل بر نخوریم. همچنین مروری داشتیم به انتخاب تایپ متغیر بر اساس context مربوط به آن.


موفق باشید :)








type inferencetypescriptتایپ اسکریپتآموزش تایپ اسکریپتزبان برنامه نویسی typescript
برنامه نویسی یک شغل نیست، یک هنره.
شاید از این پست‌ها خوشتان بیاید