로딩 관련 컴포넌트를 페이지에 추가할때 보통 위와 같이 추가하기 마련이다.
그런데 위와 같이 넣을때 에러가 발생하는 경우가 있다. 그러면 습관성 삼항 연상자를 이용해서 로딩이 아닌경우 fragement(<></>) 를 리턴하게 함으로 타입 에러를 처리하고 턴을 마친다.
그런데 이 날따라 (혹은 이제서야) 의문이 들었다. 아니 분명 위와 같이 작성해도 문제가 되지 않는 부분도 있는데, 왜 타입 에러가 발생하는 케이스가 생기는걸까?
React.Element 와 React.Node 를 먼저 잠깐 살펴보자. 이를 보통 컴포넌트 props 를 넘겨줄때 children의 타입으로 지정하면서 본적이 있을 것이다. 각각의 의미를 살짝 보자면 아래와 같다.
React.Element
- 앱을 구성하는 작은 블록으로 일반 JavaScript 객체 형태이다.
- JSX 문법 (<MyComponent />, <div></div>)을 사용하면 Babel과 같은 트랜스파일러가 내부적으로 React.createElement() 함수 호출로 변환하여 이 객체를 생성한다.
React.Node
- React 컴포넌트가 렌더링 할 수 있는 모든것.
- React Node들을 담고 있는 배열 ([<li key="1">A</li>, <li key="2">B</li>]). React는 배열 내부의 노드들을 순서대로 렌더링한다.
쉽게 말해서 <div> 처럼 태그로 이루어진 컴포넌트 들은 Element 라고 할 수 있고,
이를 포함해서 단순한 number, string 등 화면에 그릴 수 있는 모든 값이 Node에 포함된다.
이제 다시 처음의 문제로 돌아가보자.
위 코드가 적혀있는 컴포넌트 children의 타입은 React.Element로 선언되어 있다.
로딩중이라면 <LoadingScreen> 이라는 Element를 정상적으로 반환하겠지만 로딩중이 아니면 null 값이 리턴이 되는데 이는 Element범위에 속하지 않는다. 이에 타입에러가 발생했던 것이다.
리턴되는 children의 타입을 React.Node 로 수정하면 null 이 리턴되더라도 문제가 없기에 타입에러는 사라지게된다!
추가적으로 React 자체 타입정의(@types/react)에서도 PropsWithChildren 유틸리티 타입을 사용하면 children의 타입이 ReactNode로 되어있는것을 확인할 수 있다. ReactNode를 사용하는게 표준으로 봐도 무방하지 않나 싶다.
앞으로 children 의 타입은 ReactNode 를 사용하자~!
'Front-end' 카테고리의 다른 글
[pm2] error pm2@6.0.5, 해결하기! (The engine "node" is incompatible with this module. Expected version ">=16.0.0") (0) | 2025.03.24 |
---|---|
CORS, 데이터 크기도 범인일 수 있다. (0) | 2025.03.06 |
ios14 혹은 하위 버전의 ios 에서 먹지 않는 css 한가지 (inset 속성) (0) | 2025.01.21 |
[엑셀] React에서 excel 파일 받기 (1) | 2024.12.18 |
Expected positive integer for height but received 0 of type number 해결하기 (0) | 2024.12.11 |