How to use children with React Stateless Functional Component in TypeScript?
Solution 1:
You can use React.PropsWithChildren<P>
type for your props:
interface MyProps { }
function MyComponent(props: React.PropsWithChildren<MyProps>) {
return <div>{props.children}</div>;
}
Solution 2:
React 16.8 Update:
Since React 16.8, the names React.SFC
and React.StatelessComponent
are deprecated. Actually, they have become aliases for React.FunctionComponent
type or React.FC
for short.
You would use them the same way though:
const MyStatelessComponent : React.FunctionComponent<MyProps> = props =>
<div>
<p>{props.propInMyProps}</p>
<p>{props.children}</p>
</div>
Before React 16.8 (Older):
For now, you can use the React.StatelessComponent<>
type, as:
const MyStatelessComponent : React.StatelessComponent<{}> = props =>
<div>{props.children}</div>
What I have added there is setting the return type of the component to React.StatelessComponent
type.
For a component with your own custom props (like MyProps
interface):
const MyStatelessComponent : React.StatelessComponent<MyProps> = props =>
<div>
<p>{props.propInMyProps}</p>
<p>{props.children}</p>
</div>
Now, props
has got the children
property as well as those from MyProps
interface.
I checked this in typescript version 2.0.7
Additionally, you can use React.SFC
instead of React.StatelessComponent
for brevity.
Solution 3:
Simpler answer: Use ReactNode
:
interface MyProps {
children?: React.ReactNode
}
If children
is optional or not (i.e. having ?
or not) depends on your component. The ?
is the most concise way to express that, so nothing wrong with that.
On history: This was not necessarily the correct answer back when originally asked: The type ReactNode
was added in (almost) its current form in March 2017 by this pull request only, but almost everyone reading this today should be on a modern enough version of React.
Lastly, about passing children
as "attribute" (which, in React lingo, would be passing it as "prop", not attribute): It is possible, but in most cases reads better when passing JSX children:
<MyComponent>
<p>This is part of the children.</p>
</MyComponent>
reads more easily than
<MyComponent children={<p>This is part of the children.</p>} />
Solution 4:
You can just add children to the component and if it is connected to a container that is all you need.
const MyComponent = ({
children
}) => {
return <div>{children}</div>
}