Клейгерт столкнулся с запутанной ошибкой, когда флаг _hasPicked неожиданно включился. Эта проблема возникла из-за недавнего, масштабного коммита с расплывчатым комментарием. Основная проблема заключалась в том, как TypeScript обрабатывает свойства, которые также могут быть функциями с геттерами и сеттерами. Изначально checkAndPick был приватным геттером, который просто возвращал значение _hasPicked. Позже он был изменен на return this._hasPicked || (this._hasPicked = true);. Эта версия изменяла _hasPicked на true, если он был false, и всегда возвращала true. Хотя это считалось плохой практикой из-за мутации состояния в геттере, это работало как ожидалось. Ситуация усугубилась, когда код был далее изменен на return this._hasPicked || !(this._hasPicked = true);. Эта версия устанавливала _hasPicked в true, но возвращала false, что вызвало повсеместные проблемы. Фундаментальный недостаток заключается в использовании аксессоров свойств для мутации состояния, которые должны быть зарезервированы для сеттеров. Сложная или даже простая логика не должна находиться внутри аксессоров свойств.
_hasPickedнеожиданно включился. Эта проблема возникла из-за недавнего, масштабного коммита с расплывчатым комментарием. Основная проблема заключалась в том, как TypeScript обрабатывает свойства, которые также могут быть функциями с геттерами и сеттерами. ИзначальноcheckAndPickбыл приватным геттером, который просто возвращал значение_hasPicked. Позже он был изменен наreturn this._hasPicked || (this._hasPicked = true);. Эта версия изменяла_hasPickedна true, если он был false, и всегда возвращала true. Хотя это считалось плохой практикой из-за мутации состояния в геттере, это работало как ожидалось. Ситуация усугубилась, когда код был далее изменен наreturn this._hasPicked || !(this._hasPicked = true);. Эта версия устанавливала_hasPickedв true, но возвращала false, что вызвало повсеместные проблемы. Фундаментальный недостаток заключается в использовании аксессоров свойств для мутации состояния, которые должны быть зарезервированы для сеттеров. Сложная или даже простая логика не должна находиться внутри аксессоров свойств.