TypeScript 6.0 Beta — TS 7 가기 전에 tsconfig부터 정리하자
strict가 기본이 되는 날
TypeScript 6.0 Beta가 나왔다. 이번 릴리스는 새로운 문법이나 기능보다 기본값 대청소에 가깝다. --strict가 드디어 기본 true가 되고, target은 es2025로, module은 esnext로 바뀐다. 지금까지 "켜야 하는데 안 켜고 있던 것들"이 이제 처음부터 켜져 나온다.
포인트: 6.0은 단독 릴리스라기보다, Go로 재작성된 TypeScript 7.0으로 가는 징검다리다. 6.0에서 정리하지 않으면 7.0에서 한꺼번에 맞는다.
npm install -D typescript@beta바뀌는 기본값 한눈에 보기
| 옵션 | 5.x 기본값 | 6.0 기본값 | 영향도 |
|---|---|---|---|
strict | false | true | 높음 |
module | commonjs | esnext | 높음 |
target | es5 또는 es3 | es2025 | 높음 |
types | 자동 탐색 | [] (빈 배열) | 높음 |
rootDir | 추론 | . (tsconfig 위치) | 중간 |
noUncheckedSideEffectImports | false | true | 중간 |
esModuleInterop | false | true (변경 불가) | 낮음 |
가장 주의할 건 types: []이다. 이전에는 node_modules/@types/ 아래의 모든 타입 패키지를 자동으로 가져왔다. 6.0부터는 명시하지 않으면 아무것도 안 가져온다.
{
"compilerOptions": {
"types": ["node"]
}
}이걸 안 넣으면 process, Buffer, __dirname 같은 Node.js 전역 타입이 전부 사라진다. 빌드가 갑자기 수백 개의 에러를 뿜는다면, 십중팔구 이 설정이 원인이다.
[💡 잠깐! 이 용어는?]
@types 패키지: DefinitelyTyped 커뮤니티가 관리하는 서드파티 라이브러리의 타입 선언 패키지다. @types/node, @types/react 등이 있으며, types 배열에 명시하면 해당 패키지의 타입만 컴파일에 포함된다.
삭제되는 옵션들
6.0에서 deprecated 처리되고, 7.0에서 완전히 제거되는 옵션들이 있다. 비유하면 집 리모델링 전에 철거 딱지를 붙이는 단계다.
| 제거 옵션 | 대체 방법 |
|---|---|
target: "es5" | 최소 es2015 이상 사용 |
--moduleResolution node | nodenext 또는 bundler 사용 |
--module amd/umd/systemjs | ESM으로 전환 |
--baseUrl | paths에 명시적 경로 매핑 |
--outFile | 외부 번들러(Vite, esbuild 등) 사용 |
--downlevelIteration | ES5 전용이므로 불필요 |
--moduleResolution node(node10)의 제거가 특히 영향이 크다. 아직 이 설정을 쓰고 있는 프로젝트라면, bundler 또는 nodenext로 전환해야 한다.
{
"compilerOptions": {
"moduleResolution": "node",
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}
}{
"compilerOptions": {
"moduleResolution": "bundler",
"paths": {
"@/*": ["./src/*"]
}
}
}baseUrl이 사라지면서 paths의 경로를 ./로 시작하는 상대 경로로 바꿔야 한다. 사소해 보이지만, 대형 프로젝트에서는 수십 개의 경로 매핑을 수정해야 할 수 있다.
새로운 기능들
기본값 정리만 하는 게 아니다. 실용적인 기능도 들어왔다.
ES2025 타입과 Temporal API
es2025 타겟이 추가되면서 최신 ECMAScript 빌트인 타입을 사용할 수 있다.
// RegExp.escape — 특수문자 자동 이스케이프
const pattern = new RegExp(RegExp.escape("$100.00"))
// Promise.try — 동기/비동기 에러를 일관되게 처리
const result = await Promise.try(() => {
return riskyOperation()
})
// Set 메서드 — 집합 연산
const a = new Set([1, 2, 3])
const b = new Set([2, 3, 4])
const intersection = a.intersection(b) // Set {2, 3}
const difference = a.difference(b) // Set {1}// Temporal API — 날짜/시간의 새로운 표준
const now = Temporal.Now.instant()
const yesterday = now.subtract({ hours: 24 })
const date = Temporal.PlainDate.from("2026-02-20")
const nextWeek = date.add({ weeks: 1 })[💡 잠깐! 이 용어는?]
Temporal API: Date 객체의 문제점(타임존 처리, 불변성 부재, API 일관성 등)을 해결하기 위해 제안된 차세대 날짜/시간 API다. Stage 3 단계이며, 대부분의 최신 브라우저에서 구현이 진행 중이다.
Map의 getOrInsert
Map에서 "없으면 넣고 반환" 패턴을 한 줄로 처리할 수 있다.
const cache = new Map<string, number[]>()
// before — 매번 존재 여부 확인
if (!cache.has("users")) {
cache.set("users", [])
}
cache.get("users")!.push(1)
// after — getOrInsert로 한 줄
cache.getOrInsert("users", []).push(1)
// 비용이 큰 초기화는 콜백으로
cache.getOrInsertComputed("users", () => expensiveInit())Subpath Imports #/ 지원
Node.js 20+의 subpath imports에서 #/ 프리픽스를 사용할 수 있다.
{
"imports": {
"#/*": "./dist/*"
}
}// before
import { utils } from "#root/utils.js"
// after — 더 깔끔한 경로
import { utils } from "#/utils.js"TS 7.0 대비 — stableTypeOrdering
--stableTypeOrdering 플래그는 6.0에서 가장 전략적인 추가 기능이다. Go로 재작성된 TS 7.0은 타입 추론 순서가 달라질 수 있는데, 이 플래그를 켜면 6.0에서 미리 그 차이를 확인할 수 있다.
{
"compilerOptions": {
"stableTypeOrdering": true
}
}주의할 점은 약 25%의 성능 오버헤드가 있다는 것이다. CI에서만 켜서 호환성을 검증하고, 로컬 개발에서는 끄는 전략이 현실적이다.
{
"extends": "./tsconfig.json",
"compilerOptions": {
"stableTypeOrdering": true
}
}마이그레이션 체크리스트
6.0으로 올릴 때 순서대로 확인할 항목이다.
types배열에 필요한 타입 패키지 명시 (["node"]등)moduleResolution을bundler또는nodenext로 변경baseUrl제거 후paths를 상대 경로로 수정target이es5면es2015이상으로 올리기module이amd/umd/systemjs면 ESM으로 전환--outFile사용 중이면 외부 번들러로 교체- CI에서
--stableTypeOrdering켜서 TS 7.0 호환성 검증
급하게 올려야 하는데 deprecated 옵션이 너무 많다면, "ignoreDeprecations": "6.0"을 tsconfig에 추가해서 임시로 넘어갈 수 있다. 하지만 7.0에서는 이 옵션 자체가 사라지니, 미루는 것이지 해결하는 것이 아니다.
자동 마이그레이션 도구 ts5to6도 제공된다.
npx ts5to6 --project tsconfig.json마무리
TypeScript 6.0은 화려한 신기능보다 기술 부채 청산에 집중한 릴리스다. strict: true가 기본이 되고, CommonJS 중심의 레거시 옵션들이 정리된다. 불편할 수 있지만, 이 정리가 끝나야 Go 네이티브 TS 7.0의 성능 혜택을 제대로 받을 수 있다.
- 지금 당장 할 일:
types: ["node"]명시,moduleResolution전환 - CI에서 할 일:
--stableTypeOrdering으로 7.0 호환성 사전 검증 - 하지 말 것:
ignoreDeprecations로 무한정 미루기
결국 6.0은 질문 하나를 던지는 릴리스다. "너의 tsconfig, 정말 네가 의도한 대로 설정돼 있어?"
참고:
- TypeScript 6.0 Beta 공식 발표: https://devblogs.microsoft.com/typescript/announcing-typescript-6-0-beta/
- TypeScript 로드맵: https://github.com/microsoft/TypeScript/wiki/Roadmap
- ts5to6 마이그레이션 도구: https://github.com/nicolo-ribaudo/ts-migration-tools
관심 있을 만한 포스트
Tsonic — TypeScript를 네이티브 바이너리로 컴파일하는 실험
TypeScript → C# → NativeAOT 파이프라인으로 네이티브 실행 파일을 만드는 Tsonic. 어떻게 동작하고, 어떤 한계가 있는지 살펴봤다.
Babel 7.29.0 — 10년 역사의 마지막 마이너, 그리고 8 RC1
2026년 1월 31일, Babel 7의 마지막 마이너 릴리스가 공개됐다. 이 버전이 갖는 역사적 의미와 Babel 8 RC1의 핵심 변화를 정리한다.
jQuery 4.0 — 10년 만의 메이저 릴리스, 무엇이 바뀌었나
jQuery가 20주년을 맞아 10년 만에 메이저 버전을 출시했다. IE 지원 축소, ES 모듈 전환, Trusted Types 등 핵심 변경 사항을 정리한다.
달리는 차의 엔진을 바꾸다 — Nx 모노레포에서 Bun 도입까지의 여정
Nx 18에서 21까지 버전 업그레이드와 Bun 패키지 매니저 도입을 동시에 진행한 컬리의 마이그레이션 전략과 실전 이슈를 정리한다.
Babel 8 Beta — CJS를 버리고 ESM 전용으로 간다
2년간의 알파를 거쳐 베타에 진입한 Babel 8의 핵심 변경사항과 마이그레이션 전략을 정리한다.
Bun vs Node.js vs Deno — 뭐가 다른지, 그래서 뭘 쓰면 좋은지 (2026 기준)
런타임 3대장 비교: 호환성(Node), 속도/번들(Bun), 올인원/보안(Deno). 팀/프로덕트 상황별 선택 기준과 체크리스트까지 정리.
OOM이 터지고 나서야 깨달은 것들 — Webpack4에서 Vite로 갈아탄 5년 묵은 CMS
CI 빌드가 OOM으로 터진 뒤, 5년 동안 방치된 Webpack4 기반 CMS를 Vite로 전환하며 빌드 시간 48%, 번들 크기 81%를 줄인 과정.
AI 코딩의 맹점 — Artifacts 없이 에이전트는 기억을 잃는다
PRD, ADR, TDD가 AI 코딩 워크플로우에서 왜 선택이 아닌 필수인지, 실전 구조와 함께 살펴본다.