서녕이네 개발단지

[TypeScript] React.FC 란? 본문

프론트엔드/TypeScript

[TypeScript] React.FC 란?

zero2-pooh 2023. 8. 27. 00:26

React.FC란?

  • Function Component 타입의 줄임말로, React + Typescript 조합으로 개발할 때 사용하는 타입이다.
  • 함수형 컴포넌트 사용 시 타입 선언에 쓸 수 있도록 React에서 제공하는 타입이다.

React 18버전 이전까지 FC 사용을 지양했던 이유는?

1. children
  • React.FC를 사용하면 컴포넌트 props는 type이 ReactNode인 children을 암시적으로 가지게 된다. 
type TagName = {
  name: string;
};

const Tag: React.FC<TagName> = ({ name }) => (
  <div>
    <div>{name}</div>
    {children}
  </div>
);

👉🏻 타입스크립트를 쓰는 이유중 하나가 정확한 타입을 지정 해주면서 JS코드의 안전성을 향상 시키는 부분인데, FC를 사용하면 컴포넌트에 children이 있을 수 있다는 것을 가정하여 언제든지 children의 타입 지정 없이 전달이 가능하기 때문에 타입이 명확하지 않다는 단점이 있다. 

 

2. defaultProps
  • defaultProps란 props의 default 값을 설정해주는 방법이다.
  • 언어에서 전달 받는 매개변수의 default 값을 설정해주는 것과 비슷한 맥락이다. 
export const Hi: React.FC<HiProps> = ({ name }) => {
  return <h1>Hello {name}</h1>;
};

Hi.defaultProps = {
  name: "Park",
};

const App = () => (
  <>
    <Hi />
  </>
);

☝🏻 위의 코드를 실행하면 name에 Park이 들어오지 않는다. 

 

 

3. 코드 길이가 길다
  • React.FC를 사용하면 코드가 더 길다는 이유도 있다. 

 


이제 다시 사용할 수 있는 이유?

1. React.FC 타입에 암묵적인 children 선언 제거 
  • 18버전 이전엔 React.FC를 사용하면 컴포넌트 props는 type이 ReactNode인 children을 암시적으로 가지게 되었으나, 타입에 자식 노드가 꼭 필요한 컴포넌트에 자식 노드를 넣지 않았을 경우 혹은 그 반대의 경우를 타입으로 잡아내지 못한다는 단점이 있다. 

🖐🏻 그래서 암시적으로 선언되었던 children을 명시적으로 컴포넌트에 맞게 선언을 하자!! 로 바뀜.

type TagName = {
  name: string;
  children: react.ReactNode;
};

const Tag: React.FC<TagName> = ({ name, children }) => (
  <div>
    <div>{name}</div>
    {children}
  </div>
);

 

2. ReactFragment 타입에서 {} 제거
  • ReactFragment 타입에서 {} 객체가 제거됐다. 그동안 타입에서는 암묵적인 children 때문에 유지해왔는데 이번 변경으로 같이 제거됐다. 

 

3. this.context는 이제 unknown 타입
  • 그동안은 any타입이었지만 이제는 unknown 타입이다. 반드시 명확한 타입으로 캐스팅해서 써야 함!

 


만약 FC를 사용할 수 없는 환경이라면?

  • 만약 React.FC를 사용할 수 없는 환경이라면, 일반 함수 컴포넌트를 사용하면 된다. 
  • 기존 방식대로 Props 타입을 별도의 인터페이스를 정의하고 컴포넌트 함수를 작성하면 된다. 
interface Component {
  prop1: string;
  prop2: number;
}

function ComponentProps(props: Component) {
  // ...
}