개발(Development)/React(리액트)

[Next.js 13] async 서버 컴포넌트 JSX/Promise 반환 에러 해결 방법

카레유 2023. 5. 12. 10:20

# Async 서버 컴포넌트 Promise 반환 이슈

Next.js13에서 Data Fetching 등을 위해

async 함수 형태의 Server Component 를 사용하면 아래와 같은 에러가 뜰 때가 있다.

 

'ServerComponent' cannot be used as a JSX component.
Its return type 'Promise<Element>' is not a valid JSX element.
Type 'Promise<Element>' is missing the following properties from type 'ReactElement<any, any>': type, props, key
ts(2786)

 

# 원인

Next.js 13의 서버 컴포넌트를 async 함수로 사용하면 JSX가 아닌 Promise를 반환한다.

React 컴포넌트는 JSX만 반환하는 것으로 이해하는 Typescript가 아직 이 케이스를 커버하지 못해서 그렇다.

 

Next.js 팀에서 이미 인지하고 있는 타입스크립트 이슈이고 조만간 해결될 예정이라고 한다.

 

# 해결책

일단 임시 해결책은 아래 주석을 해당 서버 컴포넌트 위에 붙여 주는 것이다.

{/* @ts-expect-error Async Server Component */}

 

export default async function ServerComponent() {
  const response = await fetch("https://jsonplaceholder.typicode.com/posts");
  const postData = await response.json();
  
  return (
    <>
      {/* @ts-expect-error Async Server Component */}
      <ServerComponent data={postData} />
    </>
  );

 

그럼 에러가 사라진다.
Next.js 공식 문서에서 이렇게 하라고 명시되어 있다.

 

나중에 Typescript가 이 케이스를 커버하게 되면, 위 주석이 없어도 에러가 안 뜰 것으로 예상 된다.


혹시 @ts-expect-error 주석에 대해 좀더 알고 싶다면 아래글을 참고하자.

 

[Typescript] @ts-ignore vs. @ts-expect-error 차이, 사용법(타입 에러 무시)

 


E.O.D