Children
Properply typing children
JSX.Element
Children must be a single JSX element. Doesn't allow multiple children, or strings etc.
type ButtonProps = {
children: JSX.Element
}
const Button = ({children}: ButtonProps) => <button>{children}</button>
export function Card() {
return (
<Button>
<span>Click me</span>
</Button>
)
}
JSX.Element[]
Allows multiple JSX elements but no strings, numbers etc
type ButtonProps = {
children: JSX.Element[]
}
const Button = ({children}: ButtonProps) => <button>{children}</button>
export default function Card() {
return (
<Button>
<span>click me</span>
<i>svg icon</i>
</Button>
)
}
JSX.Element | JSX.Element[]
Allows single or multiple JSX elements but no strings, numbers etc
type ButtonProps = {
children: JSX.Element | JSX.Element[]
}
const Button = ({children}: ButtonProps) => <button>{children}</button>
export default function Card() {
return (
<Button>
<span>click me</span>
</Button>
)
}
export default function Card2() {
return (
<Button>
<span>click me</span>
<i>svg icon</i>
</Button>
)
}
React.ReactChild
Allows one React element, string or number
type ButtonProps = {
children: React.ReactChild
}
const Button = ({children}: ButtonProps) => <button>{children}</button>
export default function Card() {
return <Button>click me</Button>
}
React.ReactChild[]
Allows multiple React elements, strings or numbers
type ButtonProps = {
children: React.ReactChild
}
const Button = ({children}: ButtonProps) => <button>{children}</button>
export default function Card() {
return (
<Button>
click me
<i>svg icon</i>
</Button>
)
}
React.ReactChild | React.ReactChild[]
Allows single or multiple React elements, strings or numbers
type ButtonProps = {
children: React.ReactChild
}
const Button = ({children}: ButtonProps) => <button>{children}</button>
export default function Card() {
return <Button>click me</Button>
}
export default function Card2() {
return (
<Button>
click me
<i>svg icon</i>
</Button>
)
}
React.ReactNode
Allows multiple children, strings, numbers, fragments, portals... We could use the above example but it is a little verbose and ReactNode covers a little more.
type ButtonProps = {
children: React.ReactNode
}
const Button = ({children}: ButtonProps) => <button>{children}</button>
export default function Card() {
return (
<Button>
click me
<i>svg icon</i>
</Button>
)
}