TypeScript 7의 새로운 Go 기반 컴파일러인 tsgo가 ESLint, ts-jest, ts-morph와 같은 인기 개발 도구들을 이미 망가뜨리고 있습니다. 이 문제는 컴파일러의 프로그래밍 API가 차기 7.1 릴리스에서 안정화될 때까지 지속될 것이므로, 이러한 도구에 의존하는 팀은 업그레이드 계획을 잠시 중단해야 합니다.

TypeScript 7에서 변경된 사항

이번 릴리스에서는 TypeScript 팀이 Project Corsa라는 코드명으로 개발한 타입 체커의 Go 포트인 tsgo가 도입되었습니다. 코어 엔진을 JavaScript에서 Go로 옮김으로써 컴파일러는 최대 10배 빠른 빌드를 제공할 수 있게 되었으며, 이는 CI 파이프라인 시간을 단축하려는 초기 도입자들의 관심을 끌었습니다.

도구들이 실패하는 이유

TypeScript와 함께 작동하는 도구들은 타입 체커와 직접 통신하지 않습니다. 대신 타입 정보, 진단(diagnostics), AST 순회(traversal)를 노출하는 일련의 내부 API를 호출합니다. 이러한 API들은 tsgo를 위해 재작성되었으며 7.1 버전이 나올 때까지 계속 변경될 예정입니다. 그 결과로 연쇄적인 충돌과 무음 실패(silent failures)가 발생하고 있습니다:

  • typescript-eslint – npm에서 TypeScript 7과 함께 설치하는 것을 거부합니다. 강제로 설치하면 ESLint에서 TypeError가 발생합니다.
  • ts-jest – Go 버전에는 더 이상 존재하지 않는 내부 메서드를 호출하려고 시도하여 테스트 파일 변환이 중단됩니다.
  • ts-morph – 안정적인 API를 통해 코드 구조를 탐색할 것으로 예상하지만, 현재 API에서는 잘못된 결과를 반환하거나 경고 없이 실패할 수 있습니다.
  • Monorepos – tsgo가 특정 제네릭 타입 파라미터를 누락시켜, 규모가 큰 멀티 패키지 프로젝트에서만 나타나는 타입 에러를 유발합니다.

린팅, Jest 테스트 또는 코드 분석을 TypeScript 7과 혼합하여 사용하는 모든 워크플로우는 빌드 실패(red builds)를 겪을 가능성이 높습니다.

영향을 받는 대상

  • 모든 풀 리퀘스트(pull request)의 일부로 ESLint를 실행하는 프론트엔드 팀.
  • 유닛 테스트를 위해 ts-jest에 의존하는 백엔드 서비스.
  • 코드 생성 또는 문서화를 위해 ts-morph를 사용하는 라이브러리.
  • 타입 추론이 이미 복잡한 모노레포(monorepo) 환경을 가진 조직.

TypeScript 업그레이드 후 CI 파이프라인이 빨간색(실패)으로 변했다면, 원인은 아마도 위의 항목 중 하나일 것입니다.

7.1 버전 전까지의 안전한 마이그레이션 경로

도구를 망가뜨리지 않으면서 속도 이점을 유지하는 가장 간단한 방법은 빠른 타입 체크 단계를 실제 빌드 단계와 분리하는 것입니다:

  1. 메인 TypeScript 버전을 6.x로 고정 – 이를 통해 모든 도구가 기대하는 안정적인 API를 유지합니다.
  2. @typescript/native-preview를 devDependency로 추가 – 이 패키지는 CI에서 빠른 타입 체크를 위한 tsgo 바이너리를 제공합니다.
  3. 빠른 체크를 위해 --noEmit 옵션과 함께 tsgo 실행 – 타입을 검증하지만 출력 파일은 생성하지 않습니다.
  4. 실제 빌드에는 기존의 tsc 컴파일러 사용tsc는 여전히 JavaScript를 생성하며 6.x API를 준수합니다.
npm install -D typescript@^6.9
npm install -D @typescript/native-preview

package.json 스크립트를 업데이트하세요:

{
  "scripts": {
    "typecheck:fast": "tsgo --noEmit",
    "build": "tsc"
  }
}

이러한 이중 설정을 통해 ESLint, ts-jest, ts-morph와의 호환성을 유지하면서 CI에서의 10배 속도 향상을 누릴 수 있습니다.

바로 7.0으로 업그레이드할 수 있는 경우

코드베이스에서 린팅, Jest, ts-morph 없이 오직 tsc만 호출한다면, 불안정한 API가 영향을 미치지 않습니다. 이 좁은 범위의 시나리오에서는 즉시 TypeScript 7로 이동하여 추가 단계 없이 성능 향상을 누릴 수 있습니다.

주의 깊게 살펴볼 사항

  • 버전 7.1 – TypeScript 팀은 이 릴리스에서 프로그래밍 API가 확정(frozen)될 것이라고 예고했습니다. 7.1이 출시되면 tsgo와 기존 도구 간의 브릿지가 사라져 깔끔한 업그레이드가 가능해집니다.
  • 도구 업데이트typescript-eslint, ts-jest, ts-morph의 새로운 릴리스를 계속 주시하세요. 7.1 출시 직후 호환되는 버전이 발표될 것입니다.
  • CI 설정 – API가 안정화되면 tsgo --noEmit을 일반 tsc 호출로 교체하는 것을 잊지 마세요. 더 이상 프리뷰 패키지가 필요하지 않게 됩니다.

요약: 7.1 API 확정 전까지는 메인 컴파일러로 TypeScript 6.x를 유지하고, 빠른 체크를 위해 @typescript/native-preview를 추가하며, 빌드에는 계속 tsc를 사용하세요. 이렇게 하면 새로운 Go 엔진의 성능 이점을 누리면서도 린팅과 테스트가 깨지는 것을 방지할 수 있습니다.