ПрограммированиеBackend разработчик

Как в TypeScript работают опциональные параметры функций и опциональные свойства объектов, чем они отличаются, и какие есть нюансы при их использовании? Приведите примеры типичных проблем и ошибок.

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Опциональные параметры функций указываются с помощью вопросительного знака (?) после имени параметра. То же касается опциональных свойств в объектах (интерфейсах или типах).

  • Для функций:
function greet(name?: string) { console.log(`Hello, ${name ?? 'stranger'}`); } greet(); // Hello, stranger greet('John'); // Hello, John
  • Для объектов:
interface User { id: number; nickname?: string; } const u1: User = { id: 1 }; const u2: User = { id: 2, nickname: 'Bob' };

Нюансы:

  • Опциональный параметр — можно не передать при вызове функции, и тогда значение будет undefined.
  • Опциональное свойство — такое свойство может отсутствовать в объекте.
  • Не путайте: если в интерфейсе свойство не указано как optional, оно обязательно!
  • Опциональный параметр должен идти последним в списке аргументов функции.

Вопрос с подвохом.

Если функция объявлена с опциональным параметром типа string (function fn(x?: string)), можно ли её вызвать явно с undefined? Чем отличается fn() и fn(undefined)?

Ответ: Да, можно вызвать с undefined: fn(undefined) и fn() — результат одинаковый, но внутри функция будет получать x === undefined. Но если определено значение по умолчанию в сигнатуре:

function fn(x: string = 'demo') { console.log(x); } fn(); // demo fn(undefined); // demo fn('abc'); // abc

А если аргумент не раскрыт опциональным (нет ? или значения по умолчанию), вызов fn() будет ошибкой компиляции.

Примеры реальных ошибок из-за незнания тонкостей темы.


История

В интерфейсе user указали свойство phone: string (без ?), но забыли его добавить при создании экземпляра объекта. В итоге TypeScript-компилятор начал ругаться на отсутствие обязательного свойства. Временным решением стали добавлять phone: undefined, но это противоречило типу, так как string !== undefined, и вызвало ещё больше ошибок валидации.


История

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


История

Опциональные поля в интерфейсах были забыты при описании типа данных для внешнего API (например, фамилия клиента? string), из-за чего при смене схемы с одной стороны перестали приходить эти поля, а с другой — код начал падать при попытке их чтения без проверки на undefined.