728x90
반응형

오늘 타입스크립트에서 함수를 작성하던 중 너무 힘빠지는 오류(?)를 발견하였다.

문제의 소스코드는 아래와 같다.

async getPostsAndPaginator(boardId: number, page: number, search: string) {
    const perPage = 10;
    const offset = (page - 1) * perPage;
    const formattedSearch = `%${search}%`;

    const posts = await this.postRepository
      .createQueryBuilder("posts")
      .select()
      .where("posts.board_id = :boardId AND posts.title LIKE :formattedSearch", { boardId, formattedSearch })
      .orderBy("posts.created_at", "DESC")
      .offset(offset)
      .limit(perPage)
      .getMany();

    const totalCount = await this.postRepository
      .createQueryBuilder("posts")
      .where("posts.board_id = :boardId AND posts.title LIKE :formattedSearch", { boardId, formattedSearch })
      .orderBy("posts.created_at", "DESC")
      .getCount();

    const paginatorObj = paginator({
      totalCount: totalCount,
      page,
      perPage,
    });

    return [posts, paginatorObj];

이렇게 코드를 작성하게 되면 vscode에서

Return type of public method from exported class has or is using name 'PaginatorResult' from external module "/Users/bottlesik/nodejs-workspace/my-board-api/src/utils/paginators" but cannot be named.ts(4053)

(method) PostsService.getPostsAndPaginator(boardId: number, page: number, search: string): Promise<(Posts[] | PaginatorResult)[]>

위와 같은 오류 메시지를 발생시킨다.

하지만 나는 도대체 뭐가 문제인지 모르기에 위 소스코드에서 주석처리된 부분을 살리고 그 위 쿼리빌더 내용을 날리면

해당 메소드가 아래와 같이 정의 된다.

(method) PostsService.getPostsAndPaginator(boardId: number, page: number, search: string): Promise<any[]>

여기서 둘의 차이를 비교해보면 : Promise<(Posts[] | PaginatorResult)[]> vs : Promise<any[]> 이다

도대체가 왜 이렇게 리턴타입이 바뀌는지 도통 알 수 가 없어서 일단 위 소스코드에서 명시적으로 Promise<any[]> 를 리턴타입으로 지정해주어 해결했다. 그러나 뭐가 문제인지는 잘 모르겠다....

자바를 쓸 때는 기본적으로 리턴타입을 명시하니 이런 상황을 맞이하는 경우가 없었는데....

음 괜히 타입스크립트가 밉다.

반응형