티스토리 뷰
TypeScript 프로젝트를 라이브러리 모드로 빌드할 때 TS2742 오류를 마주하는 경우가 있습니다.
이 오류는 주로 내부에서 사용되는 타입이 외부로 제대로 내보내지지 않아 발생합니다.
특히 lottie-web과 같은 라이브러리를 사용할 때 흔히 볼 수 있으며, 이 포스팅에서는 이 문제의 원인과 해결 방법을 다룹니다.
🧐 오류의 원인
TS2742: The inferred type of '...' cannot be named without a reference to '...' 오류는 다음과 같은 이유로 발생합니다.
- 라이브러리 모드의 d.ts 생성 규칙:
- TypeScript는 라이브러리 모드에서
.d.ts파일을 생성할 때 외부로export된 대상에 대해서만 타입 정의를 만듭니다.
- TypeScript는 라이브러리 모드에서
- 내부 전용 타입 누락:
- 만약 컴포넌트나 모듈 내부에서만 사용되는 타입(예:
lottie-web의AnimationItem)이 있다면, 이 타입에 대한.d.ts파일은 생성되지 않습니다.
- 만약 컴포넌트나 모듈 내부에서만 사용되는 타입(예:
- 타입 추론 문제:
- 결과적으로, TypeScript는 내부적으로 사용된
AnimationItem타입을 안정적인 이름이나 경로로 인식하지 못하고, 외부 모듈에 대한 참조 없이 이름을 붙일 수 없다는 오류를 발생시킵니다.
- 결과적으로, TypeScript는 내부적으로 사용된
🛠️ 해결 방법
이 문제를 해결하는 가장 간단하고 명확한 방법은 패키지 엔트리 포인트에서 필요한 타입을 명시적으로 다시 내보내는(re-export) 것입니다.
예를 들어, lottie-animation.ts 파일에서 AnimationItem 타입을 사용하고 있다면, 패키지의 엔트리 포인트 파일 (index.ts 등)에 다음 코드를 추가합니다.
// 패키지의 엔트리 포인트 파일 (예: index.ts)
// 필요한 타입을 lottie-web에서 가져와 다시 내보냅니다.
export { AnimationItem } from 'lottie-web';
// 다른 모든 컴포넌트나 모듈도 내보냅니다.
export * from './components/your-component';
export * from './utils/your-utils';
이렇게 하면 TypeScript는 AnimationItem 타입이 외부로 export된 것으로 인식하여, .d.ts 파일에 올바른 타입 정의를 포함시키게 됩니다.
결과적으로 TS2742 오류는 해결되고, 안정적인 라이브러리 빌드가 가능해집니다.🎉
✅ 요약
TS2742 오류는 라이브러리 모드에서 내부적으로만 사용된 타입이 .d.ts 파일에 포함되지 않아 발생하는 문제입니다.
해결책은 패키지 엔트리 포인트에서 해당 타입을 명시적으로 re-export하여 TypeScript가 이를 올바르게 인식하도록 하는 것입니다.
'FrontEnd > typescript' 카테고리의 다른 글
| [TypeScript] TypeScript 실행 과정과 브라우저의 역할 (0) | 2025.03.21 |
|---|
- Total
- Today
- Yesterday
- pnpm 명령어
- JavaScript
- nuxt
- pakage-lock.json
- scoped slot
- vue
- uselazyasyncdata
- string table
- 바이트 코드
- string
- react-router
- interning
- useasyncdata
- npm ci
- JIT
- TypeScript
- bundler
- webpack
- vee-validate
- ViTE
- double-linked-list
- 모노레포 스크립트
- refrerence
- prototype
- react
- deep dive
- object literal
- premitive
- primitive
- library mode
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
