keepmhwn

외부 모듈로부터 타입 추론을 할 수 없었던 이유 (The inferred type of X cannot be named without a reference to Y.)-thumbnail

외부 모듈로부터 타입 추론을 할 수 없었던 이유 (The inferred type of X cannot be named without a reference to Y.)

2025년 02월 07일


위 이미지는 AI가 생성한 이미지입니다.


시작하며

최근 사내에서 사용할 라이브러리를 개발하고 있습니다. 그런데 라이브러리를 빌드 할 때 아래와 같은 에러가 발생했습니다. 이번 글에서는 아래와 같은 에러가 발생한 상황을 바탕으로 원인과 해결 방법을 정리하고자 합니다.


The inferred type of X cannot be named without a reference to Y.
This is likely not portable. A type annotation is necessary.

발단

에러가 발생했던 코드는 간략하게 아래와 같습니다. "third-library"로부터 create함수를 가져와 호출한 후에 반환 값을 x에 저장합니다. 그리고 x를 내보냅니다. 또한 라이브러리를 사용하는 쪽에서 타입 지원을 받을 수 있도록 컴파일할 때 각 모듈에 대한 .d.ts파일을 생성합니다.


import { create } from "third-library";
 
export const x = create();

타입스크립트가 각 모듈에 대한 .d.ts파일을 생성할 때 아래와 같은 코드에 대해서 명시적으로 타입을 할당하지 않아도 타입을 추론할 수 있습니다.


const x = "Hello World";

하지만 문제가 됐던 코드를 보면 x의 타입 추론은 "third-library"의 create함수에 의존적입니다. 그래서 x에 대해 타입 추론을 할 때 create의 반환 타입을 참조해야하지만 참조할 수가 없어서 위와 같은 에러가 발생한 것입니다.


그렇다면 왜 "third-library"의 타입을 참조할 수 없던 것일까요?



원인

타입을 참조할 수 없었던 이유는 pnpm의 의존성 관리 방식 때문입니다. npm의 경우에는 각 프로젝트마다 node_modules에 라이브러리를 복사합니다. 하지만 pnpm은 중앙 저장소에 라이브러리를 복사한 후에 프로젝트의 node_modules에 실제 파일을 복사하는 것이 아닌 심볼릭 링크를 사용합니다. 그런데 타입스크립트가 심볼릭 구조를 처리하는 데 어려움을 겪어 타입 추론을 하지 못하게 된 것입니다.


예를 들어, npm을 사용했을 때는 타입스크립트가 node_modules/third-library 경로에 접근한여 타입 추론이 가능했습니다. 하지만 pnpm의 경우 .pnpm/[email protected]/node_modules/third-library/의 경로를 해석하지 못하여 참조할 수 없었던 것입니다.



해결방법

이를 해결하기 위한 방법 중의 한 가지는 아래와 같이 명시적으로 타입을 선언하는 것입니다.


import { create } from "third-library";
 
export const x: ReturnType<typeof create> = create();

ReturnType<typeof create>를 사용하여 타입을 직접 참조하는 것이 아닌 typeof create를 통해 타입 정보를 가져와서 반환 타입을 바로 추론하도록 하는 것입니다.



마치며

마지막으로 정리를 해보자면 타입스크립트 코드를 컴파일할 때 타입 추론을 하여 타입의 이름을 붙입니다. 하지만 직접 참조할 수 없는 경우에 추론이 어렵고 이름을 붙이는 것이 불가능하여 아래와 같은 에러 메시지가 표시된 것입니다. 그리고 추론할 수 없었던 이유는 중앙 저장소에 실제 라이브러리를 복사하고 프로젝트에는 심볼릭 링크를 생성하기 때문에 타입스크립트가 심볼릭 링크의 경로를 해석하지 못했기 때문입니다. 이를 해결하기 위해서는 명시적으로 타입을 정의하여 타입을 추론하고 이름을 붙일 수 있도록 해야 합니다.


The inferred type of X cannot be named without a reference to Y.

다음에는 npmpnpm의 의존성 관리 방식에 대해 자세히 정리를 하고 타입스크립트가 타입 추론 후에 이름을 붙이는 이유를 정리해보려고 합니다.