seeyouletter / seeyouletter-fe

0 stars 0 forks source link

Carousel 컴포넌트를 구현한다 #56

Closed JengYoung closed 1 year ago

JengYoung commented 1 year ago

💌 설명

여러 정보들을 간략하고 깔끔하게 보여줄 수 있는 Carousel 컴포넌트를 구현합니다.

📎 관련 이슈

40

💡 논의해볼 사항

TypeScript ts2742 오류 해결

최근에 3일 동안 이 오류에 시달려 제대로 작업을 하지 못했다 😭 사실 해결 방법은 알고 있었지만, 자칫 안티 패턴이 될 수 있어 쓰질 않았다. 하지만 이것이 정답임을 며칠 만의 탐색 끝에 알아냈다.

image

수백 번의 검색 끝에 원하는 답에 가까운 글을 찾았다. Material UI styled component - "The inferred type of X cannot be named without a reference..."

What happens here is that module ts29221-a exports a type definition, module ts29221-b uses that type definition in the return type of a function, then module ts29221-c uses that function to assign a value to a const.

This is using the new build system, with refs in the tsconfig, and is bootstrapped by lerna.

What is happening here is that when tsc is compiling ts29221-c it imports the types from ts29221-b which in turn imports them from ts29221-a. It then sees that they types are at a relative position of ../b/node_modules/ts29221-a/dist compared to ts29221-c's package.json.

결국 모노레포에서 패키지를 임포트할 때, typeimport할 경로가 중첩이 되어버리는 것이다. 안타깝지만 이를 해결할 마땅한 방법이 타입스크립트 측에서는 존재하지 않음을 확인했다.

임시적으로 해결할 수 있는 방법은 declaration: false로 설정하는 것이다. 이는 전역적으로 d.ts 파일로 재정의하지 않기 때문에 동작할 수 있는 것이다. 하지만 기존의 설정을 바꾸었다는 측면에서 발생할 수 있는 부수효과가 걱정되고, 좋은 방법일까에 대한 의문이 든다.

따라서 해결 방법은, 아쉽지만 다음과 같이 경로를 불러와서 직접 모듈의 이름을 명명하는 방법이 가장 바람직한 듯하다. 이는 타입스크립트 측에서도 권고하는 사항이다.

// React를 쓰지 않더라도 이름을 부른다.
import React, { useEffect, useState } from 'react';

📝 참고자료

https://github.com/microsoft/TypeScript/issues/36800 https://github.com/microsoft/TypeScript/issues/32970 https://github.com/Microsoft/TypeScript/issues/30858

Material UI styled component - "The inferred type of X cannot be named without a reference..."

⚠️ 잠깐! 한 번 체크해주세요.