در بسیاری از توابع، همه پارامترها همیشه لازم نیستند. گاهی می‌خواهیم برخی پارامترها اختیاری باشند یا اگر مقداری ارسال نشد، یک مقدار پیش‌فرض استفاده شود.

TypeScript برای این سناریو دو ابزار مهم ارائه می‌دهد:

  • پارامتر اختیاری (Optional Parameter)
  • پارامتر با مقدار پیش‌فرض (Default Parameter)

استفاده درست از این دو قابلیت باعث می‌شود توابع انعطاف‌پذیرتر، خواناتر و امن‌تر شوند.


پارامتر اختیاری در TypeScript (Optional Parameter)

پارامتر اختیاری یعنی پارامتری که ارسال آن اجباری نیست.
برای تعریف آن از علامت ? بعد از نام پارامتر استفاده می‌کنیم.

ساختار کلی:

function functionName(param1: Type, param2?: Type) {
}

در اینجا param2 اختیاری است.


مثال ساده از پارامتر اختیاری

فرض کنید می‌خواهیم تابعی بنویسیم که نام کاربر و سن او را نمایش دهد، اما سن همیشه مشخص نیست.

function printUser(name: string, age?: number): void {
  if (age !== undefined) {
    console.log(`${name} is ${age} years old`);
  } else {
    console.log(`${name} age is unknown`);
  }
}

printUser("Ali", 25);
printUser("Sara");

خروجی:

Ali is 25 years old
Sara age is unknown

در این مثال:

  • name اجباری است
  • age اختیاری است

نکته مهم درباره پارامترهای اختیاری

پارامترهای اختیاری باید بعد از پارامترهای اجباری قرار بگیرند.

مثال اشتباه:

function example(age?: number, name: string) {
}

TypeScript خطا می‌دهد زیرا پارامتر اختیاری قبل از پارامتر اجباری قرار گرفته است.

مثال درست:

function example(name: string, age?: number) {
}

پارامتر پیش‌فرض در TypeScript (Default Parameter)

گاهی می‌خواهیم اگر کاربر مقداری ارسال نکرد، یک مقدار پیش‌فرض استفاده شود.

برای این کار مقدار پیش‌فرض را مستقیماً در تعریف پارامتر قرار می‌دهیم.

ساختار:

function functionName(param: Type = defaultValue) {
}

مثال پارامتر پیش‌فرض

فرض کنید تابعی برای محاسبه تخفیف داریم.

function applyDiscount(price: number, discount: number = 10): number {
  return price - (price * discount) / 100;
}

console.log(applyDiscount(100));
console.log(applyDiscount(100, 20));

خروجی:

90
80

در اینجا:

  • اگر discount ارسال نشود مقدار آن ۱۰ درصد در نظر گرفته می‌شود.

ترکیب پارامتر اختیاری و مقدار پیش‌فرض

در بسیاری از موارد استفاده از Default Parameter بهتر از Optional Parameter است، چون همیشه یک مقدار مشخص وجود دارد.

مثال:

function greet(name: string = "Guest"): string {
  return `Hello ${name}`;
}

console.log(greet("Ali"));
console.log(greet());

خروجی:

Hello Ali
Hello Guest

در اینجا اگر نام ارسال نشود، مقدار "Guest" استفاده می‌شود.


تفاوت Optional Parameter و Default Parameter

پارامتر اختیاری:

  • ممکن است مقدار undefined باشد
  • نیاز به بررسی داخل تابع دارد

پارامتر پیش‌فرض:

  • همیشه مقدار دارد
  • نیازی به بررسی undefined نیست

مثال مقایسه:

پارامتر اختیاری:

function greet(name?: string) {
  if (name) {
    console.log(`Hello ${name}`);
  } else {
    console.log("Hello Guest");
  }
}

پارامتر پیش‌فرض:

function greet(name: string = "Guest") {
  console.log(`Hello ${name}`);
}

روش دوم معمولاً خواناتر و ساده‌تر است.


مثال کاربردی واقعی

فرض کنید می‌خواهیم تابعی برای ارسال ایمیل بسازیم.

function sendEmail(
  to: string,
  subject: string,
  cc?: string,
  priority: string = "normal"
): void {
  console.log("To:", to);
  console.log("Subject:", subject);

  if (cc) {
    console.log("CC:", cc);
  }

  console.log("Priority:", priority);
}

استفاده:

sendEmail("user@example.com", "Welcome");
sendEmail("user@example.com", "Hello", "admin@example.com");
sendEmail("user@example.com", "Important", undefined, "high");

این الگو در پروژه‌های واقعی بسیار رایج است.


اشتباه رایج هنگام استفاده از پارامتر اختیاری

گاهی توسعه‌دهندگان بدون بررسی مقدار از پارامتر اختیاری استفاده می‌کنند.

مثال مشکل‌دار:

function upper(text?: string) {
  return text.toUpperCase();
}

اگر text ارسال نشود، خطا رخ می‌دهد.

نسخه صحیح:

function upper(text?: string) {
  if (!text) return "";
  return text.toUpperCase();
}

یا بهتر:

function upper(text: string = "") {
  return text.toUpperCase();
}

جمع‌بندی

در این جلسه با دو مفهوم مهم در TypeScript آشنا شدیم:

پارامتر اختیاری (Optional Parameter)

  • با علامت ? تعریف می‌شود
  • ارسال آن اجباری نیست
  • ممکن است مقدار undefined داشته باشد

پارامتر پیش‌فرض (Default Parameter)

  • دارای مقدار اولیه است
  • اگر مقدار ارسال نشود از مقدار پیش‌فرض استفاده می‌شود
  • معمولاً خواناتر و ایمن‌تر است

استفاده درست از این قابلیت‌ها باعث می‌شود توابع منعطف‌تر و قابل استفاده‌تر در پروژه‌های واقعی نوشته شوند.


سوالات متداول

آیا پارامتر اختیاری می‌تواند وسط پارامترها قرار بگیرد؟
خیر. پارامتر اختیاری باید بعد از پارامترهای اجباری قرار بگیرد.

چه زمانی از Default Parameter استفاده کنیم؟
زمانی که می‌خواهید تابع همیشه مقدار مشخصی داشته باشد و نیازی به بررسی undefined نباشد.

آیا پارامتر پیش‌فرض اختیاری محسوب می‌شود؟
بله. اگر پارامتر مقدار پیش‌فرض داشته باشد، ارسال آن هنگام فراخوانی تابع الزامی نیست.

دسترسی به ویدیوهای کامل دوره

برای مشاهده ویدیوهای کامل هر جلسه، دریافت تمرین‌ها، فایل‌ها و پشتیبانی، می‌توانید دوره کامل را تهیه کنید.