TypeScript 7.0 릴리스 노트: 네이티브 포트와 성능 향상

TypeScript 7.0 릴리스 노트: 네이티브 포트와 성능 향상

TypeScript 7.0은 네이티브 Go 포트를 통해 획기적인 속도 향상을 제공합니다

TypeScript 7.0은 Go로 구현된 TypeScript 컴파일러의 네이티브 포트로, 최신 하드웨어 활용을 극대화하도록 설계되었습니다. 공유 메모리 멀티스레딩과 네이티브 코드 최적화를 적용함으로써 TypeScript 7.0은 일반적으로 TypeScript 6.0에 비해 전체 빌드에서 8배에서 12배 정도의 속도 향상을 달성하고, 동시에 전체 메모리 사용량을 감소시킵니다.

성능 벤치마크

대규모 오픈소스 코드베이스에 대한 실제 테스트 결과, 빌드 시간과 메모리 사용량 모두 크게 감소함을 확인했습니다:

Codebase TS 6 Build Time TS 7 Build Time Speedup Memory Delta
vscode 125.7s 10.6s 11.9x -18%
sentry 139.8s 15.7s 8.9x -6%
bluesky 24.3s 2.8s 8.7x -26%
playwright 12.8s 1.47s 8.7x -11%
tldraw 11.2s 1.46s 7.7x -15%

전체 빌드 외에도 편집기 경험이 동일하게 가속됩니다. 예를 들어 VS Code 코드베이스에서 파일을 열 때 첫 번째 오류가 표시되는 시간이 TypeScript 6에서는 17.5초였지만 TypeScript 7에서는 1.3초 이하로 단축되었습니다.

병렬 처리 및 스케일링 제어

TypeScript 7.0은 파싱, 타입 검사, 그리고 emit 작업을 병렬화합니다. 특정 하드웨어나 CI 환경에 맞춰 성능을 최적화하기 위해 이번 릴리스에서는 여러 새로운 플래그를 도입했습니다:

  • --checkers: 타입 검사 워커 수를 제어합니다(기본값은 4). 코어 수가 많은 머신에서는 값을 늘리면 속도가 개선되지만 메모리 사용량이 증가합니다. 리소스가 제한된 환경에서는 1로 낮추어 중복 작업을 없앨 수 있습니다.
  • --builders: --build 작업 중에 사용되는 병렬 프로젝트 레퍼런스 빌더 수를 제어합니다. 특히 모노레포에 유용합니다.
  • --singleThreaded: 모든 병렬 처리를 비활성화하고 워커 수를 1로 고정하여 파싱과 emit을 단일 스레드에서 수행합니다. 주로 디버깅이나 매우 제한된 환경을 위해 제공됩니다.

재구축된 Watch 모드

--watch 모드는 Parcel 번들러의 파일 감시기를 Go로 포팅한 구현으로 완전히 재작성되었습니다. 이 교체로 C++ 툴체인이 필요 없어졌으며, 효율적이고 안정적인 크로스 플랫폼 파일 감시를 제공합니다. 이 업데이트는 리소스 사용량을 크게 개선하고 다양한 운영 체제에서 안정성을 높입니다.

TypeScript 6.0과의 호환성 및 마이그레이션

TypeScript 7.0은 TypeScript 6.0의 타입 검사와 CLI 동작과 호환되지만, 6.0의 기본값을 그대로 채택하고 여러 6.0 폐기 옵션을 강력 오류로 전환합니다.

파괴적인 설정 변경

7.0에서 몇 가지 기본값이 변경되었습니다:

  • strict가 기본적으로 true가 됩니다.
  • module 기본값이 esnext로 바뀝니다.
  • stableTypeOrdering이 기본적으로 true이며 비활성화할 수 없습니다.
  • rootDir 기본값이 ./가 되어 내부 소스 디렉터리에 대해 명시적으로 설정해야 합니다.
  • types 기본값이 []가 됩니다(이전에는 ["*"]).

지원 중단된 기능

다음 옵션은 더 이상 지원되지 않으며 강력 오류를 발생시킵니다:

  • target: es5downlevelIteration.
  • moduleResolution: node/node10moduleResolution: classic.
  • module: amd, umd, systemjs, none.
  • baseUrl(사용자는 paths를 프로젝트 루트 기준으로 상대 경로로 업데이트해야 함).
  • esModuleInterop 또는 allowSyntheticDefaultImportsfalse로 설정.
  • alwaysStrictfalse로 설정.

병행 설치

TypeScript 7.0은 아직 안정적인 프로그래밍 API를 제공하지 않으므로(7.1에서 제공 예정) typescript-eslint와 같은 도구를 위해 6.0과 병행해서 사용할 수 있습니다. 6.0 호환 패키지는 다음과 같이 설치합니다:

npm install -D typescript@npm:@typescript/typescript6

두 버전을 모두 사용하려면 아래와 같은 package.json 구성을 권장합니다:

{
  "devDependencies": {
    "@typescript/native": "npm:typescript@^7.0.2",
    "typescript": "npm:@typescript/typescript6@^6.0.2"
  }
}

언어 및 JavaScript 업데이트

템플릿 리터럴 타입의 유니코드 지원

TypeScript 7.0은 템플릿 리터럴 타입 추론 시 유니코드 코드 포인트를 보존합니다. 서러게이트 쌍(예: 이모지)을 단일 단위로 처리하여 for...of 루프와 배열 스프레드와 동일한 동작을 제공하며, JavaScript의 UTF‑16 인덱싱과는 다르게 동작합니다.

일관된 JavaScript 분석

JavaScript 지원이 TypeScript 자체 분석과 더 가깝게 재구성되었습니다. 주요 변경 사항은 다음과 같습니다:

  • 값은 타입이 기대되는 위치에서 사용할 수 없으며, typeof를 사용해야 합니다.
  • @enum은 더 이상 특별히 인식되지 않으며, 대신 @typedef를 사용합니다.
  • 독립적인 ?는 유효한 타입이 아니며 any를 사용합니다.
  • @class는 함수에 생성자 역할을 부여하지 않습니다.
  • Closure 스타일 함수 구문(function(string): void)은 더 이상 지원되지 않습니다.

편집기 지원 및 생태계 제한

TypeScript 7.0은 Language Server Protocol(LSP)과 멀티스레딩을 활용해 편집기 반응성을 향상시킵니다. VS Code 사용자는 전용 확장을 통해 이 개선을 이용할 수 있으며, Visual Studio는 워크스페이스에 따라 자동으로 적용합니다.

임베디드 언어에 대한 참고: Vue, MDX, Astro, Svelte, Angular 템플릿과 같은 워크플로는 아직 안정화되지 않은 프로그래밍 API에 의존하고 있기 때문에 TypeScript 7.0을 활용할 수 없습니다. 이러한 도구는 API가 7.1 버전에서 제공될 때까지 TypeScript 6.0을 계속 사용해야 합니다.


요약:

TypeScript 7.0은 Go로 작성된 네이티브 포트를 도입하여 공유 메모리 멀티스레딩을 통해 빌드 속도를 8배에서 12배까지 끌어올리고 메모리 사용량을 크게 줄입니다.


제목:

TypeScript 7.0 릴리스 노트: 네이티브 포트와 성능 향상

Sources