isolatedDeclarations — 선언 파일 생성 속도 혁신
isolatedDeclarations는 각 파일을 독립적으로 .d.ts를 생성 할 수 있게 해서, 선언 파일 생성을 대규모로 병렬화하는 TypeScript 5.5의 옵션입니다.
문제: .d.ts 생성의 병목
기존 TypeScript는 .d.ts 파일을 생성하려면 전체 프로젝트의 타입 체크 가 필요합니다. 한 파일의 타입이 다른 파일에 의존하기 때문입니다.
// utils.ts
export function add(a: number, b: number) {
return a + b; // 반환 타입을 추론해야 .d.ts를 생성할 수 있음
}
// app.ts
import { add } from './utils';
export const result = add(1, 2); // add의 반환 타입을 알아야 result의 타입을 추론
이 의존 체인 때문에 .d.ts 생성은 순차적으로 진행되어야 하고, 대규모 모노레포에서 병목이 됩니다.
해결: isolatedDeclarations
// tsconfig.json
{
"compilerOptions": {
"isolatedDeclarations": true,
"declaration": true
}
}
이 옵션을 켜면 TypeScript가 "각 파일만 보고 .d.ts를 생성할 수 있는가?"를 검사합니다. 불가능하면 명시적 타입 표기를 요구 합니다.
// ❌ isolatedDeclarations에서 에러
export function add(a: number, b: number) {
return a + b;
// Error: 반환 타입을 명시해야 합니다
// (다른 파일 참조 없이 이 파일만으로 .d.ts를 생성할 수 없으므로)
}
// ✅ 반환 타입을 명시
export function add(a: number, b: number): number {
return a + b;
}
// ❌ 타입 추론에 의존하는 export
export const config = { host: 'localhost', port: 3000 };
// Error: 타입을 명시하거나 as const를 사용해야 합니다
// ✅ 타입 명시
export const config: { host: string; port: number } = { host: 'localhost', port: 3000 };
// 또는
export const config = { host: 'localhost', port: 3000 } as const;
어떤 경우에 타입 표기가 필요한가
// ✅ 표기 불필요 — 이 파일만으로 타입을 알 수 있음
export const name = 'hello'; // 'hello' 리터럴
export const count: number = 42; // 명시적 표기
export type User = { name: string }; // 타입 선언
// ❌ 표기 필요 — 추론에 다른 파일이 필요할 수 있음
export function getUser(id: number) { // 반환 타입이 없음
return { id, name: 'test' };
}
// ✅ 수정
export function getUser(id: number): { id: number; name: string } {
return { id, name: 'test' };
}
규칙 요약
export하는 모든 값에 대해:
- **함수 **: 반환 타입 명시 필수
- ** 변수 **: 초기화 표현식에서 추론 가능하면 OK, 아니면 타입 명시
- ** 클래스 **: public 멤버의 타입 명시
- ** 타입 **: 항상 OK (이미 타입이므로)
왜 이것이 혁신인가
기존: 전체 프로젝트 타입 체크 → .d.ts 생성 (순차적, 단일 스레드)
isolatedDeclarations:
파일 1 → .d.ts ┐
파일 2 → .d.ts ├→ 병렬 실행 가능!
파일 3 → .d.ts ┘
각 파일이 독립적으로 .d.ts를 생성할 수 있으므로:
- esbuild, swc 같은 빠른 트랜스파일러가
.d.ts를 생성할 수 있음 - ** 멀티 코어 병렬 처리** 가능
- ** 모노레포에서 빌드 시간 대폭 감소**
실전 적용
// tsconfig.json — 단계적 적용
{
"compilerOptions": {
"isolatedDeclarations": true,
"declaration": true,
"declarationMap": true,
"strict": true
}
}
ESLint 규칙과 함께
@typescript-eslint에 explicit-function-return-type 규칙을 켜면 자연스럽게 isolatedDeclarations 호환 코드가 됩니다.
{
"rules": {
"@typescript-eslint/explicit-function-return-type": "error"
}
}
isolatedModules와의 관계
{
"compilerOptions": {
"isolatedModules": true, // 파일 단위 트랜스파일 가능
"isolatedDeclarations": true // 파일 단위 .d.ts 생성 가능
}
}
| 옵션 | 목적 | 요구 사항 |
|---|---|---|
isolatedModules | 파일 단위 JS 변환 | const enum 교차 파일 금지 등 |
isolatedDeclarations | 파일 단위 .d.ts 생성 | export의 타입 명시 |
정리
isolatedDeclarations는 각 파일이 독립적으로.d.ts를 생성할 수 있게 한다- export하는 함수의 반환 타입, 변수의 타입을 명시해야 한다
- 이를 통해
.d.ts생성을 병렬화하고 빠른 트랜스파일러에 위임할 수 있다 - 라이브러리 배포와 모노레포에서 빌드 시간을 크게 줄인다
isolatedModules와 함께 사용하면 완전한 파일 독립 빌드가 가능하다
댓글 로딩 중...