isolatedDeclarations는 각 파일을 독립적으로 .d.ts를 생성 할 수 있게 해서, 선언 파일 생성을 대규모로 병렬화하는 TypeScript 5.5의 옵션입니다.

문제: .d.ts 생성의 병목

기존 TypeScript는 .d.ts 파일을 생성하려면 전체 프로젝트의 타입 체크 가 필요합니다. 한 파일의 타입이 다른 파일에 의존하기 때문입니다.

TYPESCRIPT
// 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

JSON
// tsconfig.json
{
  "compilerOptions": {
    "isolatedDeclarations": true,
    "declaration": true
  }
}

이 옵션을 켜면 TypeScript가 "각 파일만 보고 .d.ts를 생성할 수 있는가?"를 검사합니다. 불가능하면 명시적 타입 표기를 요구 합니다.

TYPESCRIPT
// ❌ 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;

어떤 경우에 타입 표기가 필요한가

TYPESCRIPT
// ✅ 표기 불필요 — 이 파일만으로 타입을 알 수 있음
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 (이미 타입이므로)

왜 이것이 혁신인가

PLAINTEXT
기존: 전체 프로젝트 타입 체크 → .d.ts 생성 (순차적, 단일 스레드)

isolatedDeclarations:
  파일 1 → .d.ts  ┐
  파일 2 → .d.ts  ├→ 병렬 실행 가능!
  파일 3 → .d.ts  ┘

각 파일이 독립적으로 .d.ts를 생성할 수 있으므로:

  • esbuild, swc 같은 빠른 트랜스파일러가 .d.ts를 생성할 수 있음
  • ** 멀티 코어 병렬 처리** 가능
  • ** 모노레포에서 빌드 시간 대폭 감소**

실전 적용

JSON
// tsconfig.json — 단계적 적용
{
  "compilerOptions": {
    "isolatedDeclarations": true,
    "declaration": true,
    "declarationMap": true,
    "strict": true
  }
}

ESLint 규칙과 함께

@typescript-eslintexplicit-function-return-type 규칙을 켜면 자연스럽게 isolatedDeclarations 호환 코드가 됩니다.

JSON
{
  "rules": {
    "@typescript-eslint/explicit-function-return-type": "error"
  }
}

isolatedModules와의 관계

JSON
{
  "compilerOptions": {
    "isolatedModules": true,        // 파일 단위 트랜스파일 가능
    "isolatedDeclarations": true    // 파일 단위 .d.ts 생성 가능
  }
}
옵션목적요구 사항
isolatedModules파일 단위 JS 변환const enum 교차 파일 금지 등
isolatedDeclarations파일 단위 .d.ts 생성export의 타입 명시

정리

  • isolatedDeclarations는 각 파일이 독립적으로 .d.ts를 생성할 수 있게 한다
  • export하는 함수의 반환 타입, 변수의 타입을 명시해야 한다
  • 이를 통해 .d.ts 생성을 병렬화하고 빠른 트랜스파일러에 위임할 수 있다
  • 라이브러리 배포와 모노레포에서 빌드 시간을 크게 줄인다
  • isolatedModules와 함께 사용하면 완전한 파일 독립 빌드가 가능하다
댓글 로딩 중...