Что такое опциональные и параметры по умолчанию в функциях?
В 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", если его не задали явно.
Такой подход позволяет создавать гибкие функции, которые можно использовать в разных сценариях, не перегружая код лишними перегрузками или проверками.