[TypeScript] styled-components props 타입 지정하기
포스트
취소

[TypeScript] styled-components props 타입 지정하기

🧐 styled-components props에도 타입이 필요해요

styled-components에서는 props를 이용해 스타일을 동적으로 바꿀 수 있습니다. 예를 들어 버튼의 색상, 크기, 애니메이션 지연 시간 등을 props로 전달할 수 있어요.

TypeScript를 함께 사용한다면 이 props에도 타입을 지정해두는 것이 좋습니다. 그래야 어떤 값이 들어와야 하는지 컴포넌트를 사용하는 시점에 바로 확인할 수 있습니다.


📦 설치하기

TypeScript 프로젝트에서 styled-components를 사용하려면 라이브러리를 설치합니다.

1
npm install styled-components

사용 중인 버전에 따라 타입 패키지가 필요할 수 있습니다.

1
npm install -D @types/styled-components

🛠️ props 전달하기

예를 들어 여러 input에 서로 다른 애니메이션 지연 시간을 주고 싶다고 해볼게요.

1
2
3
4
5
6
7
8
9
const Answer = () => {
  return (
    <>
      <Input $delay={100} />
      <Input $delay={300} />
      <Input $delay={500} />
    </>
  );
};

여기서 $delay는 스타일 계산에만 사용할 props입니다.


🧩 단일 props 타입 지정하기

전달할 props가 하나라면 제네릭으로 바로 타입을 지정할 수 있습니다.

1
2
3
const Input = styled.input<{ $delay: number }>`
  animation-delay: ${({ $delay }) => $delay}ms;
`;

이제 $delay에는 숫자만 전달할 수 있습니다.

1
<Input $delay={300} />

문자열을 넣으면 TypeScript가 에러를 알려줍니다.

1
<Input $delay="300" />

🧱 여러 props는 interface로 분리하기

전달할 props가 많아지면 interface로 분리하는 편이 읽기 좋습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import styled, { css } from "styled-components";

interface InputProps {
  $delay: number;
  $checked: boolean;
}

const Input = styled.input<InputProps>`
  width: 100px;
  height: 40px;

  ${({ $checked, $delay }) =>
    $checked &&
    css`
      animation-delay: ${$delay}ms;
    `}
`;

$checkedtrue일 때만 animation-delay 스타일이 적용됩니다.


💡 props 이름 앞에 $를 붙이는 이유

예제에서는 delay 대신 $delay를 사용했습니다.

$가 붙은 props는 styled-components에서 transient props로 취급됩니다. 스타일 계산에는 사용할 수 있지만 실제 DOM 속성으로는 전달되지 않습니다.

이렇게 하면 다음처럼 알 수 없는 속성이 HTML에 내려가는 일을 막을 수 있습니다.

1
<input delay="300" />

스타일 전용 props라면 $delay, $checked처럼 $를 붙이는 습관을 들이면 좋습니다.


✅ 정리

TypeScript와 styled-components를 함께 사용할 때는 스타일 props에도 타입을 지정하는 것이 좋습니다.

  • 제네릭으로 props 타입을 넘길 수 있습니다.
  • props가 하나라면 inline 타입으로도 충분합니다.
  • props가 많다면 interface로 분리하면 읽기 좋습니다.
  • 스타일 전용 props에는 $를 붙여 DOM 전달을 막을 수 있습니다.
  • 조건부 스타일에는 css helper를 함께 사용할 수 있습니다.

동적인 스타일이 많아질수록 props 타입을 명확히 해두는 것이 유지보수에 도움이 됩니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

[JavaScript] setTimeout과 setInterval 차이점 정리

[JavaScript] 배열 앞뒤를 조작하는 push, pop, unshift, shift 정리