Open4
Reactのchildrenの型定義がうまくいかない問題
React@17.0.2で複数のchildren
にprops
を渡すwrapperを作るとき、ReactNode
でchildren
の型定義をすると怒られる
export const ChildrenWrapper = ({ children }: { children: ReactNode[] }) => {
return (
<div>
{React.Children.map(children, child => {
return React.createElement(child.type, { // ReactNode に type は存在しねえよ!
...{
...child.props, // ReactNode にprops は存在しねえよ!
hoge: fuga
}
})
})}
</div>
)
}
Reactのソースコードを覗いてみると
type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;
type ReactChild = ReactElement | ReactText;
type ReactFragment = {} | ReactNodeArray;
interface ReactPortal extends ReactElement {
key: Key | null;
children: ReactNode;
}
type ReactText = string | number;
interface ReactElement<P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>> {
type: T;
props: P;
key: Key | null;
}
つまり,ReactNode
はReactElement
をもとに定義されている.
これを踏まえて
- export const ChildrenWrapper = ({ children }: { children: ReactNode[] }) => {
+ export const ChildrenWrapper = ({ children }: { children: ReactElement[] }) => {
return (
<div>
{React.Children.map(children, child => {
return React.createElement(child.type, {
...{
...child.props,
hoge: fuga
}
})
})}
</div>
)
}
と書きなおすとエラーが消えた.
*\(^o^)/*ヤッター!!
ReactElement
の使いどころは今のところchildrenを回すだけな気がする.
基本汎用性の高いReactNode
を,エラったらReactElement
にする.