Что такое опциональные и параметры по умолчанию в функциях?

В TypeScript функции позволяют гибко управлять аргументами за счет опциональных параметров и параметров по умолчанию. Эти механизмы делают код более универсальным и позволяют разрабатывать функции, которые корректно работают с разным количеством передаваемых данных.

Опциональные параметры

Опциональные параметры — это такие аргументы функции, которые не обязательны к передаче. Чтобы сделать параметр опциональным, после его имени указывается знак вопроса ?.

Пример:

function greet(name: string, age?: number): string {
if (age) {
return \`Привет, ${name}. Тебе ${age} лет.\`;
}
return \`Привет, ${name}.\`;
}

В этом случае функция может быть вызвана как с возрастом, так и без него:

greet("Алексей"); // Привет, Алексей.
greet("Алексей", 30); // Привет, Алексей. Тебе 30 лет.

Особенности:

  • Опциональные параметры всегда должны идти после обязательных.

  • Если значение не передано, параметр будет undefined.

Параметры по умолчанию

Параметры по умолчанию задают значение, которое аргумент принимает автоматически, если при вызове функции он не был передан.

Пример:

function createUser(name: string, role: string = "user"): string {
return \`${name} зарегистрирован с ролью ${role}\`;
}

Здесь, если роль не указана, она будет равна "user".

createUser("Иван"); // Иван зарегистрирован с ролью user
createUser("Анна", "admin"); // Анна зарегистрирована с ролью admin

Особенности:

  • Значения по умолчанию можно задавать любым выражением, не только константой.

  • Такой параметр не обязателен к передаче, так как уже имеет дефолтное значение.

Различия между опциональными и параметрами по умолчанию

Хотя оба подхода делают аргументы необязательными, у них есть различия:

  • Опциональный параметр получает значение undefined, если его не передали.

  • Параметр по умолчанию автоматически подставляет заданное значение.

  • При опциональном параметре программист должен самостоятельно обработать отсутствие значения, а при параметре по умолчанию функция уже знает, какое значение использовать.

Совместное использование

В функции можно комбинировать оба подхода.

function logMessage(message: string, prefix?: string, level: string = "info"): void {
const fullMessage = \`${prefix ? prefix + ": " : ""}${message} \[${level}\]\`;
console.log(fullMessage);
}

В этом случае prefix можно не указывать, а level по умолчанию всегда будет "info", если его не задали явно.

Такой подход позволяет создавать гибкие функции, которые можно использовать в разных сценариях, не перегружая код лишними перегрузками или проверками.