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