๐Ÿง  12. "ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๊ฑด ์ฝ”๋“œ ๊ทธ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ Œ๋”๋ง์ด๋ผ๋Š” ์—ฌ์ •์„ ๊ฑฐ์นœ ๊ฒฐ๊ณผ๋‹ค."

JM_Devยท2025๋…„ 4์›” 25์ผ
1
post-thumbnail

๐Ÿ“ฆ TypeScript๋กœ Props ํƒ€์ž… ์ •์˜ํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋น„๊ต


React์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด Props์˜ ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ• ์ง€ ๊ณ ๋ฏผํ•  ๋•Œ๊ฐ€ ๋งŽ๋‹ค.
interface, type, React.FC ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ธ๋ฐ,
๊ฐ๊ฐ์˜ ํŠน์ง•๊ณผ ์–ธ์ œ ์–ด๋–ค ๊ฑธ ์“ฐ๋Š” ๊ฒŒ ์ข‹์€์ง€ ์ •๋ฆฌํ•ด๋ดค๋‹ค.


โœ… 1. interface ์‚ฌ์šฉ

interface ButtonProps {
  label: string;
  onClick: () => void;
}

function Button({ label, onClick }: ButtonProps) {
  return <button onClick={onClick}>{label}</button>;
}

ํŠน์ง•

  • ๋ช…์‹œ์ ์ด๊ณ  ํ™•์žฅ์ด ์‰ฌ์›€ (extends)
  • ํƒ€์ž… ๋ณ‘ํ•ฉ(declaration merging)์ด ๊ฐ€๋Šฅ
  • ์ฝ”๋“œ ์ปจ๋ฒค์…˜์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ž„

โœ… 2. type ์‚ฌ์šฉ

type ButtonProps = {
  label: string;
  onClick: () => void;
};

ํŠน์ง•

  • ์œ ๋‹ˆ์˜จ, ์ธํ„ฐ์„น์…˜ ํƒ€์ž…๊ณผ ์กฐํ•ฉ์ด ์œ ์—ฐํ•จ
  • ํŠœํ”Œ, ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ๋“ฑ ๋ณต์žกํ•œ ๊ตฌ์กฐ์— ๊ฐ•ํ•จ
  • interface๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์ž์œ ๋กญ๊ณ  ๊ฐ•๋ ฅํ•œ ๋А๋‚Œ

โœ… 3. React.FC ์‚ฌ์šฉ

interface ButtonProps {
  label: string;
}

const Button: React.FC<ButtonProps> = ({ label }) => {
  return <button>{label}</button>;
};

ํŠน์ง•

  • children์ด ์ž๋™ ํฌํ•จ๋จ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ props์— ReactNode๊ฐ€ ํฌํ•จ๋ผ ์žˆ์Œ

์ฃผ์˜์ 

  • children์ด ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ๋ฐ ์ž๋™์œผ๋กœ ํฌํ•จ๋ผ์„œ ๋ฒ„๊ทธ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•จ
  • ์ตœ๊ทผ์—๋Š” ์˜คํžˆ๋ ค ๋ช…์‹œ์ ์ธ interface/type์„ ์„ ํ˜ธํ•˜๋Š” ํ๋ฆ„

โœ… ๋น„๊ต ์ •๋ฆฌ

๊ธฐ์ค€interfacetypeReact.FC
ํ™•์žฅ์„ฑโœ… ์ข‹์Œ๐Ÿ”„ ์œ ๋‹ˆ์˜จ/์กฐํ•ฉ ๊ฐ•ํ•จโŒ ๋ณต์žกํ•œ ํƒ€์ž…์€ ๋ถˆํŽธํ•จ
children ์ž๋™ ํฌํ•จโŒ ์—†์ŒโŒ ์—†์Œโœ… ์ž๋™ ํฌํ•จ๋จ
๊ฐ€๋…์„ฑ/๋ช…์‹œ์„ฑโœ… ๋ช…ํ™•ํ•จโœ… ์ž์œ ๋กœ์›€โŒ ์•”๋ฌต์ ์œผ๋กœ ๋™์ž‘ํ•จ
์š”์ฆ˜ ์ถ”์„ธโœ… ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉโœ… ์ƒํ™ฉ ๋”ฐ๋ผ ์‚ฌ์šฉโ›” ์ง€์–‘ํ•˜๋Š” ์ถ”์„ธ

โœ… ๋‚ด๊ฐ€ ์“ฐ๋Š” ๊ธฐ์ค€

  • interface๋Š” ๊ฑฐ์˜ ๊ธฐ๋ณธ๊ฐ’์ฒ˜๋Ÿผ ์‚ฌ์šฉ (ํŠนํžˆ props ์ •์˜ ์‹œ)
  • type์€ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์ด๋‚˜, ๋‚ด๋ถ€์ ์œผ๋กœ ์กฐํ•ฉ์ด ๋งŽ์„ ๋•Œ
  • React.FC๋Š” ์“ฐ์ง€ ์•Š์Œ (children์€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ›๊ณ  ์‹ถ์Œ)

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์ฒ˜์Œ์—” React.FC๋ฅผ ๋งŽ์ด ๋ด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ผ์—ˆ๋Š”๋ฐ,
์ง€๊ธˆ์€ ์˜คํžˆ๋ ค ๋ช…์‹œ์ ์œผ๋กœ props๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒŒ ํ˜‘์—…์—์„œ๋„ ํ›จ์”ฌ ๋‚ซ๋‹ค๋Š” ๊ฑธ ๋А๋ผ๊ณ  ์žˆ๋‹ค.
ํŠนํžˆ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์“ธ์ˆ˜๋ก ์ฝ”๋“œ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์–ด์ง€๋”๋ผ.


โœ๏ธ "ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๊ฑด ๋‹จ์ˆœํ•œ ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๋ผ, ํ˜‘์—…์˜ ์•ฝ์†์ด๋‹ค."

profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€