L - подстановка Лисков
Вопрос
Что такое принцип подстановки Лисков? Как он нарушается в React?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
наследника можно подставить вместо базового, не сломав поведение
контракт нельзя ужесточать на входе и ослаблять на выходе
нарушение: обёртка над button, которая глотает часть пропсов
нарушение: компонент, который принимает onClick, но вызывает его не всегда
починка: пробрасывать ...rest и ref, не менять смысл пропсов
принцип про контракт, а не про наследование классов
Что могут спросить следом
- Зачем forwardRef в компонентах дизайн-системы
- Как типизировать компонент, расширяющий пропсы button
- Где это правило пересекается с принципом наименьшего удивления
Разбор
Если код работает с базовым типом, он должен продолжать работать с любым наследником, ничего о нём не зная. Наследник не вправе требовать больше на входе и обещать меньше на выходе.
В React наследования нет, но контракты есть. Своя <Button>, которая принимает пропсы
нативной кнопки, но втихую не пробрасывает disabled, type или ref, - прямое нарушение:
вызывающий код рассчитывает на поведение кнопки и получает сюрприз.
То же с onChange, который вызывается не на каждое изменение, или с компонентом, который
при value="" подставляет своё значение по умолчанию.
Починка: ...rest и forwardRef по умолчанию, а если поведение действительно другое -
другое имя, а не «почти кнопка».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.