--- title: Use Compound Components Over Polymorphic Children impact: MEDIUM impactDescription: flexible composition, clearer API tags: design-system, components, composition --- ## Use Compound Components Over Polymorphic Children Don't create components that can accept a string if they aren't a text node. If a component can receive a string child, it must be a dedicated `*Text` component. For components like buttons, which can have both a View (or Pressable) together with text, use compound components, such a `Button`, `ButtonText`, and `ButtonIcon`. **Incorrect (polymorphic children):** ```tsx import { Pressable, Text } from 'react-native' type ButtonProps = { children: string | React.ReactNode icon?: React.ReactNode } function Button({ children, icon }: ButtonProps) { return ( {icon} {typeof children === 'string' ? {children} : children} ) } // Usage is ambiguous ``` **Correct (compound components):** ```tsx import { Pressable, Text } from 'react-native' function Button({ children }: { children: React.ReactNode }) { return {children} } function ButtonText({ children }: { children: React.ReactNode }) { return {children} } function ButtonIcon({ children }: { children: React.ReactNode }) { return <>{children} } // Usage is explicit and composable ```