
TypeScript 6.0이 공개됐다. 이번 버전은 단순히 기능 몇 개가 추가된 업데이트라기보다, TypeScript 7.0으로 넘어가기 위한 중간 다리에 가깝다. 공식 발표에서도 TypeScript 6.0은 5.9와 7.0 사이를 잇는 전환 릴리스라고 설명한다. 특히 앞으로 나올 TypeScript 7.0은 Go로 다시 작성된 네이티브 컴파일러를 기반으로 하며, 6.0은 그 변화에 맞춰 프로젝트를 정리하고 적응하도록 돕는 역할을 한다.
즉, 이번 릴리스의 핵심은 “새로운 문법이 몇 개 생겼다”가 아니다.
진짜 핵심은 아래 두 가지다.
지금까지 TypeScript는 JavaScript 생태계의 변화에 맞춰 점진적으로 진화해 왔다. 그런데 이제는 환경 자체가 많이 달라졌다.
tsconfig.json 기반 설정이 사실상 표준이 되었다.그래서 TypeScript 6.0은 예전 호환성을 길게 끌고 가기보다, 현대적인 JavaScript/TypeScript 프로젝트에 맞게 기본값과 방향을 재정렬하는 데 초점이 맞춰져 있다.
이번 버전에서 흥미로운 변화 중 하나는 this를 쓰지 않는 함수의 타입 추론이다.
예전에는 객체 메서드 문법을 쓸 때, 파라미터 타입을 명시하지 않으면 추론이 예상과 다르게 실패하는 경우가 있었다. 특히 generic inference 과정에서, 메서드 문법은 암묵적인 this를 가질 수 있기 때문에 타입 시스템이 더 보수적으로 동작했다. 그런데 TypeScript 6.0에서는 실제로 this를 사용하지 않는다면 그 함수를 덜 민감하게 취급해서, 이전보다 더 자연스럽게 타입을 추론한다.
쉽게 말하면:
this 때문에 복잡해질 수 있으니 추론을 조심스럽게 하자”this 안 쓰네? 그럼 굳이 복잡하게 보지 말자”이 변화는 코드 스타일에 따라 괜히 타입 에러가 나던 상황을 줄여준다.
#/ 서브패스 import 지원Node.js의 imports 필드 기반 서브패스 import는 내부 경로 별칭을 만들 때 유용했지만, 그동안은 #root/*처럼 # 다음에 뭔가를 꼭 붙여야 했다. TypeScript 6.0은 이제 #/로 시작하는 서브패스 import를 지원한다. moduleResolution이 nodenext 또는 bundler일 때 사용할 수 있다.
예를 들어:
{
"imports": {
"#/*": "./dist/*"
}
}
이제는 이런 식으로 더 간단한 별칭 구성이 가능하다.
import { something } from "#/utils.js"
번들러에서 흔히 쓰던 @/ 감성과 비슷해서, 체감상 더 직관적이다.
--stableTypeOrdering 추가이 옵션은 일반적인 새 기능이라기보다, TypeScript 6.0에서 7.0으로 넘어갈 때 비교 노이즈를 줄이기 위한 마이그레이션용 옵션이다.
기존 TypeScript는 내부 타입 ID 순서에 따라 union 타입 순서나 declaration emit 순서가 달라질 수 있었다. 문제는 TypeScript 7.0이 병렬 타입 체크를 하게 되면서, 이런 순서가 비결정적으로 보일 수 있다는 점이다. 이를 해결하기 위해 7.0은 더 결정적인 정렬 방식을 쓰고, 6.0에도 그 차이를 미리 체험할 수 있도록 --stableTypeOrdering가 추가됐다.
다만 이 옵션은 항상 켜두라고 만든 기능이 아니다. 타입 체크가 최대 25% 정도 느려질 수 있다고 안내하고 있다. 그래서 실무에서는:
TypeScript 6.0은 최신 표준 API에 대한 타입 지원도 강화했다.
es2025 target/lib 추가target과 lib에 es2025를 사용할 수 있다. 여기에 RegExp.escape, Promise.try, Iterator/Set 관련 타입들이 포함된다.
Temporal 타입 내장드디어 Temporal API에 대한 타입이 내장됐다. --target esnext 또는 "lib": ["esnext"]에서 사용할 수 있다. 시간/날짜 처리를 더 안전하게 다루려는 흐름에서 의미가 크다.
Map.getOrInsert, getOrInsertComputedMap/WeakMap에서 흔히 하던 “없으면 넣고 가져오기” 패턴을 위한 upsert 계열 메서드 타입이 추가됐다. 반복 코드가 줄어든다.
RegExp.escape정규식에 안전하게 넣기 위한 문자열 escape를 표준 API 수준에서 지원한다.
dom.iterable, dom.asynciterable가 dom에 포함이제 브라우저 환경에서 NodeList 같은 DOM 컬렉션을 순회하려고 매번 dom.iterable을 따로 신경 쓸 필요가 거의 없어졌다. lib.dom.d.ts에 통합되었다.
많은 프로젝트에서 실제로 체감이 큰 부분은 여기다.
strict가 기본값으로 true이제 기본이 엄격 모드다. 새 프로젝트 기준으로는 당연한 방향이지만, 기존에 암묵적으로 느슨한 설정에 기대고 있던 코드베이스는 영향이 있을 수 있다.
module 기본값이 esnextESM 중심 흐름을 반영한 결정이다.
target 기본값이 최신 연도 ES 버전현재 기준으로는 es2025가 기본 타깃이 된다. 예전처럼 오래된 브라우저까지 자동으로 낮춰 주는 철학이 아니다.
rootDir 기본값이 . 로 변경예전에는 소스 파일 구조를 보고 추론했지만, 이제는 tsconfig.json이 있는 디렉터리 기준으로 더 명시적으로 동작한다. src 구조 프로젝트라면 직접 "rootDir": "./src"를 적어야 기존 출력 구조를 유지할 수 있다.
types 기본값이 []이 변화는 실무에 꽤 크다. 예전에는 node_modules/@types를 사실상 자동으로 훑어왔는데, 이제는 기본이 비어 있다. 대신 필요한 타입만 명시적으로 넣게 바뀌었다. 공식 설명에 따르면 이로 인해 빌드 시간이 20~50% 개선된 사례도 있다고 한다.
즉 이제는 흔히 아래처럼 적어야 한다.
{
"compilerOptions": {
"types": ["node", "jest"]
}
}
이 변화는 성능과 예측 가능성 측면에서는 매우 합리적이지만, 업그레이드 직후 process, fs, describe 같은 전역/환경 타입이 갑자기 안 잡히는 상황을 만들 수 있다.
TypeScript 6.0은 꽤 많은 오래된 옵션과 관행을 사실상 정리하기 시작했다. 대표적으로 다음이 눈에 띈다.
target: es5 deprecated--downlevelIteration deprecated--moduleResolution node deprecated--moduleResolution classic deprecatedmodule: amd | umd | systemjs | none 제거baseUrl deprecatedesModuleInterop: false, allowSyntheticDefaultImports: false 불가alwaysStrict: false deprecatedoutFile 제거module Foo {} 문법 deprecatedimport ... asserts {} deprecated, 이제 with 사용/// <reference no-default-lib="true"/> deprecated 이 목록이 중요한 이유는, 단순히 “옛날 기능이 없어지네” 정도가 아니기 때문이다.
TypeScript 팀이 말하고 싶은 방향이 분명하다.
이제 기본 전제는
ESM / 번들러 / 현대 런타임 / 명시적 설정 / 더 빠른 빌드다.
예전 스타일의 설정을 그대로 유지하면 6.0에서는 경고로 끝날 수 있어도, 7.0에서는 실제 마이그레이션 비용이 더 커질 가능성이 높다.
TypeScript 6.0으로 올릴 때는 기능보다 tsconfig.json을 먼저 봐야 한다.
types 명시Node, Jest, Bun, Mocha 등 필요한 전역 타입을 직접 넣어야 한다.
업그레이드 후 갑자기 전역 이름이 안 잡히면 거의 여기 문제다.
rootDir 확인dist/src/...처럼 출력 경로가 이상해졌다면 rootDir을 명시해야 한다.
baseUrl 제거 검토기존 baseUrl + paths 조합을 썼다면, paths에 직접 경로 prefix를 넣는 방식으로 바꾸는 것이 권장된다.
moduleResolution 재선택nodenextbundler이 방향으로 옮기는 것이 권장된다.
특히 import ... asserts 같은 구문은 with로 바꿔야 한다.
6.0만 올리고 끝내지 말고, 가능하면 --stableTypeOrdering나 7.0 preview도 한번 돌려서 차이를 미리 확인하는 게 좋다. TypeScript 팀도 6.0을 도입할 수 있다면 7.0 preview를 함께 시험해 보라고 권장한다.
TypeScript 6.0은 “새 기능이 많은 버전”이라기보다,
TypeScript 7.0 시대를 준비시키는 정리용 릴리스다.
tsconfig 기본값과 오래된 옵션 정리다.types, rootDir, moduleResolution, baseUrl는 꼭 다시 봐야 한다. 개인적으로 이번 릴리스는 “기능 추가”보다 “방향 선언”에 가깝다고 느껴진다.
앞으로 TypeScript는 더 명시적이고, 더 현대적인 런타임을 기준으로, 더 빠른 빌드를 지향하는 쪽으로 확실히 이동하고 있다.