



흔히 볼 수 있는 컴포넌트를 lazy loading 하는 컴포넌트다.
여기서 fake-external-component라는 컴포넌트를 로드할 건데, fake-external-component는 아래 컴포넌트가 있는 특정 모듈 파일이라고 가정하자.

필수값 id를 props로 받는 컴포넌트다.
그렇다면 이제 문제는 <LazyLoad /> 를 호출했을 때, 정확한 props를 작성했음에도 타입 에러가 나는 것이다.


이 부분의 문제일 가능성이 농후하다. 리액트에서 제공하는 lazy의 타입 데피니션을 살펴보자.

lazy는 ComponetType을 확장한 것을 알 수 있다.

즉, lazy에 인자로 들어가는 loader의 타입을 촵촵해서 변경해야 하는 것이다.

lazy의 타입 데피니션에서 봤던 것처럼 loader 타입을 변경했다.
그럼 요상한 에러가 나온다.


위 에러는 fake-external-component가 컴포넌트가 아니라서 나오는 에러다. 즉, 전체 모듈을 가져온 것이지 (export default) 컴포넌트가 아니기 때문에 에러 나온 것이다.

이제 동적으로 props 타입을 받아야 하기 때문에 Props를 제네릭으로 만든다.

<C extends ComponentType<any>> 로 타입을 확장하면서 C가 리액트 컴포넌트임을 알려주고, ComponentType로 Props를 추론할 수 있게 된다.
이제 LazyLoad 함수를 살펴보면 LazyComponent에러가 나는 것을 볼 수 있다.


뭔가 어려운 내용의 에러인데, 요약하자면 LazyComponent에 전달할 props 타입이 정의되지 않았다는 것이다.
loader만 정의하고 props에 대해선 타입을 정의하지 않았기 때문에 ComponentProps를 이용해 타입도 정의해줘야 한다.

이제 필수값인 id를 props에서 제거해보면


컴파일 에러가 잘 나온다.
만약 로드하는 컴포넌트에 새로운 props를 추가하면, (name을 추가함)


사용처에서 자동완성을 찾을 수 있다. ComponentProps가 타입을 추론하기 때문!
참고: total typescript