TypeScript (1)

Jaeheonยท2022๋…„ 10์›” 27์ผ
0

TypeScript

๋ชฉ๋ก ๋ณด๊ธฐ
1/1
post-thumbnail

Typing the Props

ํ‰์†Œ์— ํ•˜๋Š”๋Œ€๋กœ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด props๋ฅผ ์ „๋‹ฌํ•ด๋ด…์‹œ๋‹ค.

import styled from "styled-components";

const Container = styled.div`
  width: 100px;
  height: 100px;
  background-color: ${props=>props.bgColor};
`;

const Text = styled.h1``;

function Circle({bgColor}){
  return <Container bgColor={bgColor}/>
}

function App() {
  return (
    <>
      <Circle bgColor="tomato"/>
    </>
  );
}

export default App;

ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. props์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ๋ฌธ์ œ
  2. styled-components ๋‚ด์—์„œ ์ž‘์„ฑํ•œ props.bgColor์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ๋ฌธ์ œ

1๋ฒˆ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด props์˜ ํƒ€์ž…์„ interface๋ฅผ ํ†ตํ•ด ์ •์˜ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

interface CircleProps {
  bgColor: string;
}

function Circle({bgColor}:CircleProps){
  return <Container bgColor={bgColor}/>
}

2๋ฒˆ์˜ ๊ฒฝ์šฐ TypeScript์—๊ฒŒ bgColor๋ฅผ styled-component์—๊ฒŒ๋„ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๊ณ  ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋™์ผํ•˜๊ฒŒ interface๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋˜์ง€๋งŒ ์—ฌ๊ธฐ์„  bgColor๊ฐ€ string ํƒ€์ž…์œผ๋กœ ๋™์ผํ•˜๋ฏ€๋กœ CircleProps๋ฅผ ์žฌ์‚ฌ์šฉ ํ•ด๋ด…์‹œ๋‹ค.

const Container = styled.div<CircleProps>`
  width: 100px;
  height: 100px;
  background-color: ${props=>props.bgColor};
`;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ์—” ์ปดํฌ๋„ŒํŠธ ๋‘๊ฐœ๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜๋Š” ์‚ฌ๊ฐํ˜•์œผ๋กœ ํ•˜๋‚˜๋Š” ์›์œผ๋กœ ์ถœ๋ ฅํ•ด๋ด…์‹œ๋‹ค.
๋™์ผํ•œ ์ฝ”๋“œ๋กœ ์‚ฌ๊ฐํ˜•์„ ๋‘๊ฐœ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ํ•˜๋‚˜๋Š” ์›์œผ๋กœ ๊นŽ์•„๋ด…์‹œ๋‹ค.

function App() {
  return (
    <>
      <Circle bgColor="tomato"/>
      <Circle bgColor="teal" borderRadius="100px"/>
    </>
  );
}

๊ธฐ์กด์— ํ•˜๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ TS์—๊ฒŒ ์ƒˆ๋กœ์šด props์ด ๋“ค์–ด์™”์œผ๋‹ˆ ํƒ€์ž… ํžŒํŠธ๋ฅผ ์ค˜์•ผ๊ฒ ์ฃ ?
interface์— ์ƒˆ๋กœ์šด props์˜ ํƒ€์ž…์„ ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค.

interface CircleProps {
  bgColor: string;
  borderRadius: string;
}

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ๋„ํ˜•์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.
Property 'borderRadius' is missing in type '{ bgColor: string; }' but required in type 'CircleProps'.

"CircleProps์—์„œ borderRadius ํƒ€์ž… ์จ๋†“๊ณ  ์™œ ์‚ฌ์šฉ์•ˆํ•˜๋‹ˆ?" ๋ผ๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌผ์Œํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

interface CircleProps {
  bgColor: string;
  borderRadius?: string;
}

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด์— string ํƒ€์ž…์œผ๋กœ๋งŒ ์ •์˜๋œ borderRadius์— undefined ๊ฐ€ ๋“ค์–ด์™€๋„ ํ—ˆ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๋œป์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
CircleProps.borderRadius?: string | undefined

Optrinal Props

๋Œ€๋ถ„์˜ ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ์˜ Props์™€ Styled Components์˜ props๊ฐ€ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
์—ฐ์Šต์„ ์œ„ํ•ด ๋‘๊ฐœ์˜ interface๋ฅผ ๋ถ„๋ฆฌํ•ด์ค€ ์ƒํƒœ๋กœ ๋‹ค์‹œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค.

import styled from "styled-components";

interface ContainerProps{
  bgColor: string;
  borderRadius: string;
}

interface CircleProps {
  bgColor: string;
  borderRadius?: string;
}
const Container = styled.div<ContainerProps>`
  width: 100px;
  height: 100px;
  background-color: ${props=>props.bgColor};
  border-radius: ${props=>props.borderRadius};
`;

const Text = styled.h1``;

function Circle({bgColor, borderRadius}:CircleProps){
  return <Container bgColor={bgColor} borderRadius={borderRadius}/>
}

function App() {
  return (
    <>
      <Circle bgColor="tomato"/>
      <Circle bgColor="teal" borderRadius="100px"/>
    </>
  );
}

export default App;

๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋˜ styled components ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
์ œ๊ฐ€ ContainerProps์—๋Š” ?๋ฅผ ์•ˆ์คฌ๊ฑฐ๋“ ์š”,

interface ContainerProps{
  bgColor: string;
  borderRadius: string;
}
interface CircleProps {
  bgColor: string;
  borderRadius?: string;
}

๋ฐฐ์šด์ง€ ํ•˜๋ฃจ์ฐจ์ธ ์ œ ์ƒ๊ฐ์ด์ง€๋งŒ ? ๊ธฐํ˜ธ๋ฅผ ๋‚จ๋ฐœํ•ด์„œ undefined๋ฅผ ํ—ˆ์šฉํ•ด์ฃผ๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ TS์—์„œ ์ง€ํ–ฅํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์• ์ดˆ์— TS๋ฅผ ์“ฐ๋Š” ๋ชฉ์ ์ด ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ปดํŒŒ์ผ ์ „์— ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉ์ ์ด ํฌ๋‹ˆ๊นŒ์š”.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๋ถ€๋ถ„์€ ๋‹ค์Œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

return <Container bgColor={bgColor} borderRadius={borderRadius}/>

borderRadius๊ฐ€ ํ•œ์ชฝ Container์—๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ฐก์ฐก๋Œ€๋‹ˆ๊นŒ, default ๊ฐ’์„ ์ค˜๋ฒ„๋ฆฌ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋„ค์š”.
๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ”๋ด…์‹œ๋‹ค.

<Container bgColor={bgColor} borderRadius={borderRadius ?? "0px"}/>

์ด ์ฝ”๋“œ๋Š” borderRadius๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ??์˜ ์™ผ์ชฝ์ธ borderRadius๋ฅผ ์“ฐ๊ณ , ์—†์œผ๋ฉด "0px"๋กœ ํ•˜๊ฒ ๋‹ค ๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด React Props๋ฅผ ์ „๋‹ฌํ•  ๋•Œ default ๊ฐ’์„ ์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์ข‹๊ฒ ๋„ค์š”!

function Circle({bgColor, borderRadius="0px"}:CircleProps){
  return <Container bgColor={bgColor} borderRadius={borderRadius}/>
}

๋‘ ๊ฐ€์ง€ ๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค๐Ÿ˜Š

์ฃผ๊ด€์  ํ›„๊ธฐ

TypeScript๋ฅผ ๋ฐฐ์šด ์ฒซ๋‚ ์ธ๋ฐ ๊ต‰์žฅํžˆ ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ์กด์— ํŒŒ์ด์ฌ์„ ์‚ฌ์šฉํ•ด์„œ ๋™์  ํƒ€์ดํ•‘์–ธ์–ด์— ์ต์ˆ™ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— TypeScript๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ๊บผ๋ ค์กŒ๋Š”๋ฐ ์˜คํžˆ๋ ค JS๋ณด๋‹ค ํ›จ์”ฌ ์ง๊ด€์ ์ด๊ณ  ํŽธํ–ˆ์Šต๋‹ˆ๋‹ค.
์• ์ดˆ์— JS๋Š” ์—๋Ÿฌ๊ฐ€ ์—„์ฒญ ๋ถˆ์นœ์ ˆํ–ˆ๋Š”๋ฐ TS์˜ ๊ฒฝ์šฐ ๋งค์šฐ ์นœ์ ˆํ•˜๊ฒŒ ์—๋Ÿฌ๋ฅผ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ–ˆ๋Š”์ง€ ํ‹ฐ์นญ๋ฐ›๋Š” ๋Š๋‚Œ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก : TS ์งฑ์งฑ๐Ÿ˜Š

profile
๊ธฐ๋ก์ด ์Šต๊ด€์ธ ๊ฐœ๋ฐœ์ž

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