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.
결국 모노레포에서 패키지를 임포트할 때, type을 import할 경로가 중첩이 되어버리는 것이다.
안타깝지만 이를 해결할 마땅한 방법이 타입스크립트 측에서는 존재하지 않음을 확인했다.
임시적으로 해결할 수 있는 방법은 declaration: false로 설정하는 것이다.
이는 전역적으로 d.ts 파일로 재정의하지 않기 때문에 동작할 수 있는 것이다.
하지만 기존의 설정을 바꾸었다는 측면에서 발생할 수 있는 부수효과가 걱정되고, 좋은 방법일까에 대한 의문이 든다.
따라서 해결 방법은, 아쉽지만 다음과 같이 경로를 불러와서 직접 모듈의 이름을 명명하는 방법이 가장 바람직한 듯하다.
이는 타입스크립트 측에서도 권고하는 사항이다.
// React를 쓰지 않더라도 이름을 부른다.
import React, { useEffect, useState } from 'react';
💌 설명
여러 정보들을 간략하고 깔끔하게 보여줄 수 있는 Carousel 컴포넌트를 구현합니다.
📎 관련 이슈
40
💡 논의해볼 사항
TypeScript ts2742 오류 해결
최근에 3일 동안 이 오류에 시달려 제대로 작업을 하지 못했다 😭 사실 해결 방법은 알고 있었지만, 자칫 안티 패턴이 될 수 있어 쓰질 않았다. 하지만 이것이 정답임을 며칠 만의 탐색 끝에 알아냈다.
수백 번의 검색 끝에 원하는 답에 가까운 글을 찾았다. Material UI styled component - "The inferred type of X cannot be named without a reference..."
결국 모노레포에서 패키지를 임포트할 때,
type
을import
할 경로가 중첩이 되어버리는 것이다. 안타깝지만 이를 해결할 마땅한 방법이 타입스크립트 측에서는 존재하지 않음을 확인했다.임시적으로 해결할 수 있는 방법은
declaration: false
로 설정하는 것이다. 이는 전역적으로d.ts
파일로 재정의하지 않기 때문에 동작할 수 있는 것이다. 하지만 기존의 설정을 바꾸었다는 측면에서 발생할 수 있는 부수효과가 걱정되고, 좋은 방법일까에 대한 의문이 든다.따라서 해결 방법은, 아쉽지만 다음과 같이 경로를 불러와서 직접 모듈의 이름을 명명하는 방법이 가장 바람직한 듯하다. 이는 타입스크립트 측에서도 권고하는 사항이다.
📝 참고자료
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..."
⚠️ 잠깐! 한 번 체크해주세요.