Both seem to result in no compilation errors, but what's the difference and is one preferable to the other?
ReactNode is wider, it can be text, number, boolean, null, undefined, a portal, a ReactElement, or an array of ReactNodes. It represents anything that React can render. JSX. Element is an internal hook for Typescript.
Regardless of what a component ends up rendering, React. createElement always returns an object, which is the JSX.
"The render method returns a description of what the DOM should look like, and then React efficiently updates the real DOM to match."
render() The render() method is the only required method in a class component.
This exact question was asked over in the react-typescript-cheatsheet repo issue #57
To quote the original answer:
Regardless of what a component ends up rendering,
React.createElement
always returns an object, which is theJSX.Element
interface, butReact.ReactNode
is the set of all possible return values of a component.
JSX.Element
-> Return value ofReact.createElement
React.ReactNode
-> Return value of a component
Generally, I think the idea is that JSX.Element
specifically describes the interface of React.createElement
and is narrow in scope whereas React.ReactNode
is more broad and covers all possible values that a Component could return.
It depends. ReactJS in principle can render:
type RenderType = JSX.Element* | Array<RenderType> | string | number | boolean | null // * includes Portal, Fragment // for both function and class components // (type doesn't exist in React type declarations)
TS render types are currently limited to:
Class component: ReactNode
(wider than permitted by React)
Function component: JSX.Element | null
(more restrictive than React)
JSX.Element
is more or less the same as ReactElement
, you can use both interchangeably.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With