ویرگول
ورودثبت نام
Navid Barsalari
Navid Barsalariمهندس ارشد نرم‌افزار | تکنیکال لید | +۱۰ سال سابقه علاقه‌مند به System Design، توسعه بک‌اند (Go / Node.js) و معماری دیتابیس. تمرکز فعلی من روی ساخت و توسعه سرویس‌های مقیاس‌پذیر B2B است.
Navid Barsalari
Navid Barsalari
خواندن ۲ دقیقه·۱ ماه پیش

🚀 تایپ‌اسکریپت: Never در مقابل Void (تله‌ی بازگشت توابع)

🧠 خلاصه‌ی مطلب

در تایپ‌اسکریپت، دو نوع void و never هر دو نشان‌دهنده "عدم وجود مقدار" هستند، اما مفهوم آن‌ها کاملاً متفاوت است:

  • void: تابع به پایان می‌رسد، اما هیچ مقدار معناداری برنمی‌گرداند.

  • never: تابع هرگز به پایان نمی‌رسد (یا خطا پرتاب می‌کند یا وارد حلقه‌ی بی‌نهایت می‌شود).

درک این تفاوت برای مدیریت خطاها و نوشتن کدهای ایمن (Robust) حیاتی است.

🏗️ نوع void چیست؟

زمانی از void استفاده می‌کنیم که تابع یک کار جانبی (Side Effect) انجام می‌دهد (مثل چاپ در کنسول یا تغییر یک وضعیت) اما چیزی برای بازگشت به فراخواننده ندارد.

TypeScript

function logMessage(msg: string): void { console.log(msg); // است undefined در واقع خروجی }

اگر سعی کنید مقداری را برگردانید، تایپ‌اسکریپت خطا می‌دهد. پیام این تایپ این است: «این تابع کارش تمام می‌شود، اما خروجی خاصی ندارد.»

🛑 نوع never چیست؟

تایپ never نشان‌دهنده وضعیتی است که تابع نمی‌تواند به پایان برسد. این یعنی اجرای کد در آن نقطه متوقف یا منحرف می‌شود.

"This function finishes, but ignore whatever it returns."

function throwError(msg: string): never { throw new Error(msg); } function infiniteLoop(): never { while (true) { } }

وقتی تابعی از نوع never باشد، هر کدی که بعد از فراخوانی آن نوشته شود، از نظر تایپ‌اسکریپت "Unreachable" یا غیرقابل دسترس است.


🔍 تفاوت‌های کلیدی: void در مقابل never

از آنجایی که جدول‌ها در ویرگول گاهی بد نمایش داده می‌شوند، تفاوت‌ها را اینجا لیست کرده‌ام:

  • مفهوم: در void چیزی برنمی‌گردد، اما در never اصلاً بازگشتی در کار نیست.

  • وضعیت اجرا: در void تابع با موفقیت تمام می‌شود، اما در never تابع متوقف شده یا می‌هنگد.

  • کاربرد: void برای لاگ گرفتن و تغییرات ساده است؛ never برای مدیریت خطا و حلقه‌های بی‌نهایت.

  • خروجی نهایی: خروجی void در واقع undefined است، اما never هیچ خروجی‌ای ندارد.


🔥 ترفند بررسی کامل (Exhaustive Check)

اینجاست که never قدرت خود را نشان می‌دهد. می‌توانید از آن برای مطمئن شدن از اینکه تمام حالت‌های یک Union Type در دستور switch پوشش داده شده‌اند، استفاده کنید:

TypeScript

type Action = "run" | "stop"; function handleAction(action: Action) { switch (action) { case "run": return "Running..."; case "stop": return "Stopped."; default: // اضافه کنید، اینجا خطای کامپایل می‌گیرید! jump اگر بعداً حالتی مثل const _exhaustiveCheck: never = action; return _exhaustiveCheck; } }

اگر "jump" را به Action اضافه کنید اما فراموش کنید آن را در switch بنویسید، تایپ‌اسکریپت به شما هشدار می‌دهد چون "jump" نمی‌تواند در یک متغیر از نوع never قرار بگیرد.


🧠 سخن پایانی

  • void = «کارم تموم شد، ولی چیزی برات ندارم.» 🤝

  • never = «من دیگه از این تابع برنمی‌گردم!» 💀

اگر به دنبال این هستید که:

  • باگ‌ها را در زمان کدنویسی شکار کنید.

  • منطق برنامه‌تان را کامل و بدون نقص بنویسید.

👉 همیشه برای توابعی که خطا پرتاب می‌کنند یا اجرای برنامه را متوقف می‌کنند، از never استفاده کنید.

✍️ جمله‌ای برای به خاطر سپردن

از void وقتی استفاده کن که تابع تمام می‌شود؛ از never وقتی که نباید تمام شود.

تایپ اسکریپتجاوااسکریپتjavascript
۴
۰
Navid Barsalari
Navid Barsalari
مهندس ارشد نرم‌افزار | تکنیکال لید | +۱۰ سال سابقه علاقه‌مند به System Design، توسعه بک‌اند (Go / Node.js) و معماری دیتابیس. تمرکز فعلی من روی ساخت و توسعه سرویس‌های مقیاس‌پذیر B2B است.
شاید از این پست‌ها خوشتان بیاید