Одна из самых распространенных проблем, корни которые уходят в bootstrap, это закладывать модификаторы как boolean
флаги, например:
type ButtonProps = { primary?: boolean; danger?: boolean; warning?: boolean; info?: boolean; // ... etc }
Проблема в том, что bootstrap тоже не идеален, кроме этого, он «CSS-фреймворк» и в итоге, используя подобный подход в компонентах, вы получаете неконтролируемую комбинаторику, типа
<Button primary info warning>WTF?</Button>
Никто это никак не покрывает тестами, никаких варнингов в консоле не выдаёт, ну а внешний вид будет зависеть от того, в какой последовательности описаны эти «модификаторы» в CSS.
Есть ещё смешной момент, когда в коде, нужен будет динамический «mode», это будет решать как-то так:
mode === 'warning' ? <Button warning/> : <Button primary/> ; // Либо <Button primary={!!mode || mode === 'primary'} warning={mode ==== 'warning'} info={mode ==== 'info'} />
Поэтому сделайте сразу правильно, а именно, если параметры взаимоисключающие, то заверните их в одно enum
свойство, например:
Кроме того, конкретно для кнопки есть прикольный факт, практически все делают «primary» и не учитывают его в логике компонента, в итоге либо жестко ставят тип кнопки по умолчанию «button», либо никакой, а следовательно это будет «submit». Второй исход хуже первого, но лучше просто учитывать этот момент при выставлении типа кнопки по умолчанию, тоже самое и обратно, выставлять «mode» кнопки от её «type»:
Всё выше перечисленное относиться не только к кнопке (просто у меня только кнопка есть :]), но и к любому другому компоненту, всегда думайте над комбинаторингом свойств и не плодите boolean
свойства в угоду их «псевдо-красоте», которое в добавок и не расширяемо.