Мне было поручено улучшить функцию фильтра на веб-платформе. Несколько компонентов наследуются от родительского компонента «Корневая таблица», и эти компоненты отображают таблицы с различной информацией.
Корневая таблица имеет функцию фильтра с таблицами данных, заменяя dataSource.filterPredicate собственным настраиваемым фильтром. Некоторые из дочерних компонентов при необходимости перезаписывают родительский компонент, и они хотят, чтобы я убрал необходимость перезаписи.
По сути, некоторые компоненты имеют нажимаемые кнопки для применения других условий фильтра, помимо поля поиска. Когда они перезаписывают родительскую функцию фильтра, они фактически запускают код заново с добавлением единственной строки внизу, чтобы отфильтровать результаты по этим кнопочным фильтрам.
К сожалению, они не планировали заранее с этим дизайном и 1) Не все объекты имеют фильтр и 2) Каждый объект, у которого есть фильтр, использует свое имя, для которого он основан на части данных. (Booking.status в качестве одного примера, Vehicle.type в качестве другого)
Вот и моя проблема. По-видимому, они непреклонны в том, чтобы не иметь дочерних функций, перезаписывающих родительский элемент практически одинаковой строкой кода 1. (Всего около 15 строк).
Первые идеи, которые у меня были, - передать функцию в фильтр, которая является необязательной и предоставляется детьми при необходимости, для запуска этой одной строки. Кроме того, родительская функция, которая всегда вызывается, но ничего не делает, перезаписывается только теми детьми, которые в ней нуждаются.
Ничто из этого невозможно, поскольку filterPredicate находится в собственной области видимости, и я не могу получить доступ к другим функциям из фильтра, а также не могу изменить параметры, которые ДОЛЖНЫ соответствовать базовому фильтру (например, данные: T, фильтр : string).
Теперь они предложили иметь функцию, которая возвращает функцию фильтра, с добавлением дополнительных функций, хотя это ТОЛЬКО выполняется один раз.
Я новичок в Typescript и понятия не имею, что еще я могу сделать. Помимо предложения оставить его как есть с небольшим дублирующим кодом или реструктуризации своих объектов для лучшего соответствия этому дизайну (оба из которых были отклонены), у меня есть другие варианты?