React children with TypeScript
0. ๋น ๋ฅธ ์์ฝ
React.ReactNode ๋๋ React.PropsWithChildren<T>๋ฅผ ์ฌ์ฉํ์.
import React from "react";
interface IProps {
children: React.ReactNode;
}
const Box = ({ children }: IProps) => {
return (
<div>
<div>Box ๋ถ๋ถ์
๋๋ค.</div>
{children}
</div>
);
};
export default Box;๋๋
interface IProps {
anyProps: any;
}
const Box = ({ children }: React.PropsWithChildren<IProps>) => {
return (
<div>
<div>Box ๋ถ๋ถ์
๋๋ค.</div>
{children}
</div>
);
};1. ๊ฐ์
React์ props์ค children์ React์ ๊ฐ๋ ฅํ ํฉ์ฑ ๋ชจ๋ธ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์ฌ๊ธฐ์ ํฉ์ฑ์ด๋ผ๋ ๊ฒ์ ์ปดํฌ๋ํธ์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ฐ๋จํ ์์๋ง ๋ณด๊ณ ๋์ด๊ฐ๋ค.
const Box = ({ children }) => {
return (
<div>
<div>Box</div>
{chldren}
</div>
);
};
const Item = () => {
return (
<Box>
<div>Item</div>
</Box>
);
};Item ์ปดํฌ๋ํธ๋ Box ์ปดํฌ๋ํธ์ ๋ชจ์์ ๊ทธ๋๋ก ๋ด์ผ๋ฉด์ Item ์ปดํฌ๋ํธ๋ง์ JSX๋ฅผ ๋ฐํํ๊ณ ์๋ค. React children์ ๋ํ ์ถ๊ฐ์ ์ธ ์์ธํ ์ค๋ช
์ React ํ์ด์ง์์ ๋์ค์ ๋ค๋ฃจ๋๋ก ํ๊ณ ์ฌ๊ธฐ์๋ React children์ ํ์
์ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํ๋ค.
chlidren props์ ์๋์ ๊ฐ์ ๋ด์ฉ์ ๋ด์์ง์ ๋ฐ๋ผ ํ์
์ ๋ค๋ฅด๊ฒ ์ค์ ํด์ค์ผ ํ๋ค.
React Element
primitive(ex, ๋ฌธ์์ด)
๋ฐฐ์ด
2. JSX.Element
๊ฐ์ฅ ์ ํ์ ์ธ ์ ํ์ด๋ค. ๋จ์ผ Element์ ๋ด์ ๋๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์๋์ ์์๋ฅผ ์ดํด๋ณด์.
// Box.tsx
interface IProps {
children: JSX.Element;
}
const Box = ({ children }: IProps) => {
return (
<div>
<div>Box ๋ถ๋ถ์
๋๋ค.</div>
{children}
</div>
);
};
export default Box;
// App.tsx
import Box from "./Box";
function App() {
return (
<Box>
<div>App ๋ถ๋ถ์
๋๋ค.</div>
</Box>
);
}
export default App;App ์ปดํฌ๋ํธ๋ Box ์ปดํฌ๋ํธ์ ๊ฐ์ธ์ ธ ์๋ค. ์ฆ, App ์ปดํฌ๋ํธ๊ฐ Box ์ปดํฌ๋ํธ์ ๋ด์์ ธ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๊ธด App ์ปดํฌ๋ํธ์ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
<div>App ๋ถ๋ถ์
๋๋ค.</div>์ด๋ ๊ฒ ๋จ์ผ Element๋ฅผ children์ผ๋ก ๋ด์ ๋ ์๋์ ๊ฐ์ด children๋ฅผ JSX.Element ํ์
์ผ๋ก ์ง์ ํ๋ค.
interface IProps {
children: JSX.Element;
}2-1. ์ค๋ฅ 1) ์ฌ๋ฌ ๊ฐ์ Element
์ค๋ฅ ์ฝ๋
import Box from "./Box"; function App() { return ( <Box> <div>App ๋ถ๋ถ์ ๋๋ค.</div> <div>App ๋ถ๋ถ์ ๋๋ค.</div> </Box> ); } export default App;
ํ์ง๋ง ๋จ์ผ Element๊ฐ ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ Element๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ๊ทธ๋ ๊ฒ ๋๋ฉด ์๋์ ์ฌ์ง๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณผ ์ ์๋ค.

ํ๋์ ์์์ด ์๋ ์ฌ๋ฌ ๊ฐ์ ์์์ด children์ผ๋ก ์ ๊ณต๋์๋ค๋ ๋ด์ฉ์ด๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ Element๋ฅผ ํ๋์ ํ๊ทธ๋ก ๋ฌถ์ด์ฃผ๋ฉด ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.(์๋ ์ฝ๋ ์ฐธ๊ณ )
import Box from "./Box";
function App() {
return (
<Box>
<div>
<div>App ๋ถ๋ถ์
๋๋ค.</div>
<div>App ๋ถ๋ถ์
๋๋ค.</div>
</div>
</Box>
);
}
export default App;2-2. ์ค๋ฅ 2) string ํ์
์ Text
์ค๋ฅ ์ฝ๋
import Box from "./Box"; function App() { return <Box>App ๋ถ๋ถ์ ๋๋ค.</Box>; } export default App;
์ด๋ฒ์ Element ํ์
์ children์ด ์๋๋ผ string ํ์
์ children์ด๋ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น. ์๋์ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณผ ์ ์๋ค.

3. React.ReactChild
React.ReactChild ํ์
์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฌธ์์ด ๊ฐ์ primitive๋ children์ผ๋ก ํ์ฉ์ด๋๋ค.
// Box.tsx
import React from "react";
interface IProps {
children: React.ReactChild;
}
const Box = ({ children }: IProps) => {
return (
<div>
<div>Box ๋ถ๋ถ์
๋๋ค.</div>
{children}
</div>
);
};
export default Box;
// App.tsx
import Box from "./Box";
function App() {
return <Box>App ๋ถ๋ถ์
๋๋ค.</Box>;
}
export default App;
// App2.tsx
import Box from "./Box";
function App() {
return (
<Box>
<div>App ๋ถ๋ถ์
๋๋ค.</div>
</Box>
);
}
export default App;3-1. ์ค๋ฅ 1) ์ฌ๋ฌ ๊ฐ์ Element
์ค๋ฅ ์ฝ๋
import Box from "./Box"; function App() { return ( <Box> <div>App ๋ถ๋ถ์ ๋๋ค.</div> <div>App ๋ถ๋ถ์ ๋๋ค.</div> </Box> ); } export default App;
JSX.Element ํ์
์ ์ฌ์ฉํ์ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ๊ฐ์ Element๋ฅผ ์ฌ์ฉํ ์ ์๋ค.

3-2. ์ค๋ฅ 2) Element์ Text ํจ๊ป ์ฌ์ฉ
์ค๋ฅ ์ฝ๋
import Box from "./Box"; function App() { return ( <Box> <div>App ๋ถ๋ถ์ ๋๋ค.</div> App ๋ถ๋ถ์ ๋๋ค. </Box> ); } export default App;
React.ReactChild์ ๋จ์ผ ์์๋ง ํ์ฉ์ ํ๋ค.

3-3. ์ค๋ฅ 3) ๋ฐฐ์ด ์ฌ์ฉ
์ค๋ฅ ์ฝ๋
import Box from "./Box"; function App() { return ( <Box> {[1, 2, 3, 4].map((item, index) => ( <div key={index}>{item}</div> ))} </Box> ); } export default App;
children ๋ถ๋ถ์ ๋ฐฐ์ด์ ์ฌ์ฉ์ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ด๊ฒ ๋ํ ๊ฐ๋ฅํ์ง ์๋ค.
React.ReactChild ํ์
์ Element[]์ ํํ์ ํ์
์ ํ์ฉํ์ง ์๋๋ค๋ ์ค๋ฅ๋ฅผ ๋ณผ ์ ์๋ค.

์ด๋ฐ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ children์ ํ์
์ React.ReactChild[]๋ก ๋ฐ๊พธ์ด ์ฃผ๋ฉด ๋๋ค. ํด๋น ํ์
์ ์ฌ๋ฌ๊ฐ์ Element๋ฅผ ํ์ฉํ๋ค. ๋จ Text์ Element๋ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
3-4. ReactChild ํ์
์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋๋ค.
children๋ฅผ React.ReactChild ํ์
์ผ๋ก ์ค์ ํ ๊ณณ์ ๋ณด๋ฉด ReactChild์ ๊ฐ์ด๋ฐ์ ์ ์ด ๊ทธ์ด์ ธ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ํ์
์ด๋ผ๋ ๋ป์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฌ์ฉํ์ง ๋ง๊ณ ์ด๋ฌํ ํ์
์ด ์์๋ค๋ ๊ฒ๋ง ์๊ณ ๋์ด๊ฐ์.

4. React.ReactNode
React.ReactNode๋ ๋ชจ๋ ๊ฒ์ ๋ด์ ์ ์๋ ์ต๊ฐ์ ํ์
์ด๋ค. ๋จ์ผ Element, ๋ค์์ Element, ๋ฐฐ์ด, ๋ฌธ์์ ๊ฐ์ ๊ฒ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๊ณ ์์ด์ ์ฌ์ฉ ๋ํ ๊ฐ๋ฅํ๋ค.
// Box.tsx
import React from "react";
interface IProps {
children: React.ReactNode;
}
const Box = ({ children }: IProps) => {
return (
<div>
<div>Box ๋ถ๋ถ์
๋๋ค.</div>
{children}
</div>
);
};
export default Box;
// App.tsx
import Box from "./Box";
function App() {
return (
<Box>
App ๋ถ๋ถ์
๋๋ค.
{[1, 2, 3, 4].map((item, index) => (
<div key={index}>{item}</div>
))}
<div>App ๋ถ๋ถ์
๋๋ค.</div>
</Box>
);
}
export default App;5. React.PropsWithChildren<T>
<T>ํด๋น ํ์ ์ ์๋์ ๊ฐ์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
children๋ฟ ์๋๋ผ ๋ค๋ฅธprops๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ
import React from "react";
interface IProps {
anyProps: any;
}
const Box = ({ children }: React.PropsWithChildren<IProps>) => {
return (
<div>
<div>Box ๋ถ๋ถ์
๋๋ค.</div>
{children}
</div>
);
};
export default Box;children๋ง ์กด์ฌํ ๊ฒฝ์ฐ
import React from "react";
const Box = ({ children }: React.PropsWithChildren) => {
return (
<div>
<div>Box ๋ถ๋ถ์
๋๋ค.</div>
{children}
</div>
);
};
export default Box;React.PropsWithChildren<T> ํ์
๋ React.ReactNode ํ์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ๊ฒ์ ๋ด์ ์ ์๋ค.
5. Conclusion
ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ํญ์ ์ด๋ค ํ์ ์ ์ฌ์ฉํ ์ง ๊ตฌ๊ธ๋ก ๊ฒ์์ ํ๋ฉด์ ์ฐพ๋๋ค. ๋งค๋ฒ ๊ฐ์ ๋ด์ฉ์ด์ง๋ง ์์ง ์ต์ํ์ง ์์ ๊ณ์ ๊ฐ์ ๋ด์ฉ์ ์ฐพ๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ง์ ๊ณต๊ฐ์ ์ ๋ฆฌ๋ฅผ ํ๊ณ ๊ณ์ ์ฐธ๊ณ ํด์ ๋ณด๋ฉด ์ฐพ๊ธฐ๋ ํจ์ฌ ์ฝ๊ณ ์ ๋ฆฌ๊ณ ์ค์ค๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ด ์ ๋ค์ด์จ๋ค. ๋ํ ํ์ํ ๋ด์ฉ์ ์ถ๊ฐ ์ญ์ ๋ ๊ฐ๋ฅํ๋ ์์ผ๋ก ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฉด์ ์์ฃผ ์ฌ์ฉ๋๊ณ ์ค์ํ ๋ด์ฉ์ ์ ๋ฆฌํด์ผ๊ฒ ๋ค. ์ด๋ฒ ๊ณต๋ถ๋ฅผ ํตํด React Children์ ํ์ ์
React.ReactNode๋๋React.PropsWithChildren<T>๋ฅผ ์ฌ์ฉํ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ๋์๋ค.
์ฐธ๊ณ
React Children ๊ณผ ์นํด์ง๊ธฐ React children with typescript. ๋ฆฌ์กํธ children ์ปดํฌ๋ํธ ํ์ดํ ํ์ ์คํฌ๋ฆฝํธ : React.FC๋ ๊ทธ๋ง! children ํ์ดํ ์ฌ๋ฐ๋ฅด๊ฒ ํ๊ธฐ
๐ 2022-08-23
Last updated