> Как улучшить сигнатуру функции, чтобы избежать передачи undefined? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Исходный Код

Стек: JavaScript

> Пример ответа

Короткий ответ

Основные подходы: использовать параметры по умолчанию (function foo(x = defaultValue)), явные проверки на undefined в теле функции, или перейти к объекту параметров с деструктуризацией и значениями по умолчанию. В TypeScript - строгая типизация и optional chaining. Для сложных случаев применяйте discriminated unions или перегрузку функций.

Подробное объяснение

Проблема передачи undefined возникает из-за динамической природы JavaScript и отсутствия строгой типизации. Основные причины: необязательные аргументы, неполные вызовы, legacy-код.

Способы решения:

  1. Параметры по умолчанию (ES6): function greet(name = 'Guest') - undefined заменяется на дефолтное значение. Не работает для null.

  2. Явные проверки: if (arg === undefined) arg = default - даёт контроль, но загромождает код.

  3. Объект параметров: function config({ host = 'localhost', port = 8080 } = {}) - явно задаёт все поля, исключает неопределённые.

  4. TypeScript: function foo(x?: string) - компилятор предупредит о возможном undefined.

  5. Перегрузка функций: разные сигнатуры для разных случаев.

  6. Optional chaining и nullish coalescing: const value = obj?.prop ?? 'default' - на стороне вызова.

Trade-off: параметры по умолчанию просты, но не решают проблему с null. Объект параметров лучше для множества опций, но требует больше boilerplate.

На практике

В реальных проектах комбинируйте подходы:

  • Для простых функций с 1-2 опциональными аргументами - параметры по умолчанию.
  • Для конфигураций и функций с 3+ параметрами - объект с деструктуризацией.
  • В TypeScript - используйте strictNullChecks и явные типы с | undefined.
  • Для критичных API - валидация на входе с выбрасыванием ошибки при undefined.

Избегайте передачи undefined в цепочках вызовов - используйте ?? для подстановки значений по умолчанию на месте вызова.

Пример кода

JAVASCRIPT
// Плохо: неявный undefined
function createUser(name, age) {
// age может быть undefined
}
// Хорошо: параметры по умолчанию
function createUser(name, age = 18) {
// age всегда число
}
// Лучше для сложных случаев: объект параметров
function createUser({ name, age = 18, role = 'user' } = {}) {
// все поля явные
}
// TypeScript с защитой
function processData(input: string | undefined): void {
const safeInput = input ?? 'default';
}

Как отвечать на собеседовании

Начните с базовых параметров по умолчанию, затем переходите к объекту параметров для сложных случаев. Упомяните TypeScript и strict mode. Приведите пример из практики - как вы рефакторили функцию с 5+ опциональными аргументами. Подчеркните важность читаемости и предсказуемости кода.

Что проверяет интервьюер

  • Понимание семантики undefined vs null в JavaScript.
  • Знание современных возможностей языка (ES6+, TypeScript).
  • Умение выбирать правильный паттерн под конкретную задачу.
  • Навыки проектирования API функций.
  • Понимание trade-off между гибкостью и строгостью.

Типичные ошибки

  • Путать undefined и null - они обрабатываются по-разному в параметрах по умолчанию.
  • Использовать параметры по умолчанию для всех случаев, включая обязательные аргументы.
  • Забывать про дефолтное значение для всего объекта параметров (= {}).
  • Переусложнять сигнатуру, когда достаточно простой проверки.
  • Игнорировать TypeScript и полагаться только на runtime-проверки.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью