일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- BFS
- 프론트엔드
- TypeScript
- HTML
- 가상화
- 컴퓨터공학
- k8s
- 리액트
- 파이썬
- AWS
- 타입스크립트
- 솔리디티
- 이슈
- 알고리즘
- CSS
- 백준
- 이더리움
- kubernetes
- es6
- 백엔드
- docker
- next.js
- 블록체인
- JavaScript
- 웹
- 쿠버네티스
- react
- 클라우드
- 자바스크립트
- node.js
Archives
- Today
- Total
즐겁게, 코드
React 18의 "Property 'children' does not exist..." 이슈 본문
함수 컴포넌트를 사용할 때 React.FC
라는 제네릭을 활용하면 children
, displayName
, defaultProps
등의 함수 컴포넌트가 갖는 기본 속성들에 대해 타입 지원을 받을 수 있습니다.
import React from "react";
export const Child: React.FC = ({children}) => {
return <>{children}</>
}
아마 React.FC
를 사용하는 가장 큰 이유도 chlidren
을 갖는 컴포넌트의 타입을 지정하기 위해서일 텐데요, 하지만 React 18부터는 위 코드에서 Property 'children' does not exist on type... 이라는 오류가 출력됩니다.
그 이유는 children
프로퍼티가 React.FC
에서 제외되었기 때문으로, React 18부터는 아래와 같이 명시적으로 children
의 타입을 지정해주는 것으로 해결할 수 있습니다.
import React, { ReactNode } from "react";
type ChildProps = {
children: ReactNode;
};
export const Child = ({ children }: ChildProps) => {
return <>{children}</>;
};
🔎 제외된 이유에 대해서는 이 글 에서 더 확인해보실 수 있는데요, 주요 골자는 일반 함수 컴포넌트와 React.FC 타입의 일관된 동작을 위해서라고 합니다.
React.FC 조금 더 살펴보기
한번 @types/react
17 버전과 18 버전이 각각 React.FC
를 정의한 내용을 살펴보겠습니다.
- @types/react 17에서 정의한 함수 컴포넌트
type FC<P = {}> = FunctionComponent<P>;
interface FunctionComponent<P = {}> {
// props 매개변수의 타입 : PropsWithChildren<P>
(props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
propTypes?: WeakValidationMap<P> | undefined;
contextTypes?: ValidationMap<any> | undefined;
defaultProps?: Partial<P> | undefined;
displayName?: string | undefined;
}
- @types/react 18에서 정의한 함수 컴포넌트
type FC<P = {}> = FunctionComponent<P>;
interface FunctionComponent<P = {}> {
// props 매개변수의 타입 : P
(props: P, context?: any): ReactElement<any, any> | null;
propTypes?: WeakValidationMap<P> | undefined;
contextTypes?: ValidationMap<any> | undefined;
defaultProps?: Partial<P> | undefined;
displayName?: string | undefined;
}
둘의 미묘한 차이가 보이시나요?
react 17까지는 함수 컴포넌트가 PropsWithChildren<P>
라는 제네릭으로 props
를 갖도록 되어 있었지만, React 18부터는 PropsWithChildren
이 아닌 단순 P
라는 타입의 props
를 갖게 되었습니다.
따라서 리액트 18 버전부터는 React.FC
를 사용해도 자동으로 children
타입에 대한 지원을 받을 수 없고, 명시적으로 해당 컴포넌트에 주어지는 Props
타입에 children
과 그 타입을 정해줘야 합니다.
반응형
'🎨 프론트엔드 > React.js' 카테고리의 다른 글
이벤트 핸들러, 제대로 제거하고 계셨나요? (1) | 2021.12.31 |
---|---|
미리 만나보는 automatic batching (0) | 2021.12.27 |
ReactNode, ReactChild, ReactElement 타입 비교 (0) | 2021.10.16 |
야, 너도 상태관리 할 수 있어 2편 : 리코일 사용하기 (0) | 2021.08.25 |
야, 너도 상태관리 할 수 있어 1편 : 리코일이란? (1) | 2021.08.24 |
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆