در تایپاسکریپت، دو نوع void و never هر دو نشاندهنده "عدم وجود مقدار" هستند، اما مفهوم آنها کاملاً متفاوت است:
void: تابع به پایان میرسد، اما هیچ مقدار معناداری برنمیگرداند.
never: تابع هرگز به پایان نمیرسد (یا خطا پرتاب میکند یا وارد حلقهی بینهایت میشود).
درک این تفاوت برای مدیریت خطاها و نوشتن کدهای ایمن (Robust) حیاتی است.
زمانی از void استفاده میکنیم که تابع یک کار جانبی (Side Effect) انجام میدهد (مثل چاپ در کنسول یا تغییر یک وضعیت) اما چیزی برای بازگشت به فراخواننده ندارد.
TypeScript
function logMessage(msg: string): void { console.log(msg); // است undefined در واقع خروجی }
اگر سعی کنید مقداری را برگردانید، تایپاسکریپت خطا میدهد. پیام این تایپ این است: «این تابع کارش تمام میشود، اما خروجی خاصی ندارد.»
تایپ 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 در واقع undefined است، اما never هیچ خروجیای ندارد.
اینجاست که 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 وقتی که نباید تمام شود.