This article is published in English.
TypeScript 6.0's Breaking Defaults: A Practical Migration Guide
Learn which nine TypeScript 6.0 compiler defaults changed, how to configure tsconfig for 2026, and how to prepare codebases for the Go-based TypeScript 7.
If your build recently started throwing errors under moduleResolution: node, you haven't broken anything on your end. TypeScript 6.0 quietly rewired nine compiler defaults, and teams that postponed the upgrade are now hitting these changes all at once. Here's the direct version: this is not an update you can keep deferring indefinitely. TypeScript 6.0 is the final release built on the original JavaScript-based compiler. TypeScript 7 arrives as a complete rewrite in Go, and early reports point to compilation speeds up to 10 times faster than what you get today.
What Actually Changed
- Strict mode ships on by default. Any new project you scaffold now inherits
strict: trueout of the box. If you're maintaining an older codebase, expect a wave of new diagnostics tied to implicitanytypes and nullability checks that previously stayed silent. - The default compilation target moved from ES3 to ES2022. Almost nobody was actually shipping ES3 output, but if your pipeline wasn't explicitly pinning a target, this jump changes what code the compiler emits by default.
- ESM becomes the default module system. Codebases still leaning heavily on
require()calls need a genuine review of their module strategy, since the assumptions baked into the compiler no longer favor CommonJS. moduleResolution: nodeis now deprecated. The recommended path is to move tobundlerornodenext, since bundler-style resolution now matches how tools like Vite actually resolve modules in practice.--outFilealong with AMD, UMD, and SystemJS output formats are no longer supported. If your build still targets any of these, TypeScript 6.0 isn't ready for your project yet.- The
assertkeyword for import attributes has been replaced bywith.
A Recommended 2026 tsconfig
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"isolatedDeclarations": true,
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"skipLibCheck": true
}
}
Applying this configuration across several medium-sized React and Next.js codebases this quarter surfaced errors that were almost always genuine bugs rather than false positives.
The New stableTypeOrdering Flag
This flag doesn't get enough attention. It normalizes the internal ordering of type unions, which means diffs between output from the legacy JavaScript compiler and the upcoming Go-based compiler actually carry meaning instead of being noise from arbitrary reordering. Turning it on now and getting a clean compile is effectively a dry run that pre-validates your codebase ahead of the TypeScript 7 transition.
The Importance of This For Full-Stack Teams
- Editor responsiveness has improved noticeably, since the language service is now faster than the underlying compiler itself, and the language service is what you interact with constantly during daily development.
- Type definitions across Redux, React, and Next.js are being tightened, so expect stricter inference showing up in your state management code as those packages update.
- The plugin ecosystem is unsettled right now. Compiler plugins written for the current TypeScript compiler will not carry over to 7.0, so if your tooling depends on any of them, keep an eye on their compatibility status.
Practical Migration Steps
- Start the upgrade on a dedicated development branch rather than directly against your main line.
- Run
tsc --noEmitand triage the resulting errors by how frequently a pattern occurs across the codebase, not by which file happens to list them first. - Address
moduleResolutionbefore anything else, since it tends to be the setting that exposes the most unexpected breakage. - Only after everything else compiles cleanly should you turn on
stableTypeOrdering, as a final confirmation that the migration is solid.
Closing Thoughts
TypeScript 6.0 doesn't announce itself with dramatic new features. What it represents is careful, deliberate housekeeping that precedes the most significant architectural shift the language has seen since it was created. Handle this migration in manageable batches while you still have the bandwidth to control the process. Delaying it doesn't remove the work, it just pushes that same work into a future moment when you'll have less time and more pressure to get it right.