Опциональные параметры функций указываются с помощью вопросительного знака (?) после имени параметра. То же касается опциональных свойств в объектах (интерфейсах или типах).
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' };
Нюансы:
Если функция объявлена с опциональным параметром типа 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.