в данном случае Вы представили два варианта условных ветвлений,
в первом случае описывается Optional chaining operator.
во втором случае обычное представление if else как есть,
ну а дальше если углубится, то имеет значение как Вы формируете компоненты, функции, на сколько они стабильны при выполнении под нагрузкой, например 1000 запросов,
ведь если взять Вашу строку кода
resizeObserver?.disconnect()
,
обычно классикой программирования считается когда Вы указываете программе если ДА, то одно действие,
если НЕТ, то другое действие, если даже функция по каким-либо причинам не срабатывает она должна что-то возвращать (например false, null). Эта практика используется для стабильности кода, чтобы программа не додумывала сама.
к примеру, если к Вашей строке кода resizeObserver?.disconnect() добавить тернарный оператор, например
resizeObserver?.disconnect() ? 'observer_some_action()' : 'observer_another_action()' || null;
В этом случае можно получить дополнительную функциональность кода, например для тестов, чтобы не ловить конкретное событие в общем стеке.
Или resizeObserver?.disconnect?.() ?.() эта запись проверит существует ли вообще функция disconnect().
Ошибки можно и не ловить конечно, но без их отработки Вы не достигните более стабильной работы программы,
также стоит отметить, что типы данных(typescript), увеличивают стабильность кода, а добавление в некоторых случаях например, else {null} может уменьшить блокирование Вашей программы, то есть ошибка или сбой загрузки чего либо будет, но при этом Вы не потеряете доступ к Вашему UI, и сможете что-то клацать ещё.
но если взять примеры с промисов javascript, там есть варианты пропускания отрицательных ответов,
return new Promise((resolve) => {
setTimeout(function() {
console.log('2');
return resolve(2);
}, 1000); }
}
можно даже ошибки не обрабатывать.
В целом .? позволяет Вам более интересно работать с данными, но не стоит им злоупотреблять. т.к. это может скрыть проблемы в Вашем коде, их применяют для чтения и удаления, но не записи.