React.FC์ ๋ฌธ์ ์
props์๋ ๋ ์ข ๋ฅ๊ฐ ์๋ค.
- ๋ช ์์ props: props ํ์ ์ ๋ช ์์ ์ผ๋ก ์์ฑ๋์ด ์๋ props
- ์์์ props:
@types/react
๋ฑ์ ์ํด ์๋์ ์ผ๋ก ์ถ๊ฐ๋๋ props
React.FC์ props๋ ๊ธฐ๋ณธ์ ์ผ๋ก children
์ ํฌํจํ๋ค. ์ฆ, React.FC๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ children
์ด ์์์ props๊ฐ ๋๋ค.
excess props: ์ปดํฌ๋ํธ์ ๋๊ฒจ์ง์ง๋ง ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋์ง ์๋ props
→ excess props์ ์กด์ฌ๋ POLA์์น์ ์ด๊ธฐ๊ฒ ๋ง๋ ๋ค.
POLA: Principle of Least Astonishment ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์๊ฐ ์์ํ๋๋ก ์๋ํด์ผ ํ๋ค๋ ์์น
์์์ props์ธ children
์ excess props์ ํด๋นํ๋ค. ์ฌ์ฉ์ ๋ชจ๋ฅด๊ฒ ์ปดํฌ๋ํธ์ props๋ก ๋๊ฒจ์ง๊ธฐ ๋๋ฌธ์, ์ปดํฌ๋ํธ์ ์์ธก ๋ถ๊ฐ๋ฅํ ๋์์ ์ผ๊ธฐํ ์ ์๋ค.
// ์์
const App: React.FC = () => { /*... */ };
const Example = () => {
<App><div>Unwanted children</div></App>
}
๋ฐ๋ผ์ children
prop์ ๋ช
์ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
ํด๊ฒฐ๋ฐฉ์
React.PropsWithChildren<T>
์ ์ฌ์ฉํ๋ค.
type PropsWithChildren<P = unknown> = P & { children?: ReactNode | undefined };
๋ด๊ฐ ๋๊ธด props ํ์
์ children์ ์ถ๊ฐํ ํ์
์ ๋ฆฌํดํ๋ค. ์ด๋ฅผ ํตํด children
์ ๋ช
์์ props๋ก ๋๊ฒจ์ค ์ ์๋ค.
์ฌ์ฉ๋ฐฉ๋ฒ
// ์ฌ์ฉ๋ฐฉ๋ฒ1: ๋ด๊ฐ ์ ์ํ props ํ์
๊ณผ ํจ๊ป ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ
interface MyProp {
foo: any;
}
function App(props: React.PropsWithChild<MyProp>) {
return <div>{props.children}</div>
}
// ์ฌ์ฉ๋ฐฉ๋ฒ2: children prop๋ง ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ
function App({children}: React.PropsWithChildren) => {
...
}