A Decade of "Someday" Deprecations Just Became Hard Errors
TypeScript 6.0 spent a release quietly marking a long list of legacy options as deprecated — target: "es5", the amd/umd/systemjs/none module formats, a handful of rarely-used compiler flags. Nothing broke. It just warned.
TypeScript 7.0 is the release where all of that warning becomes a hard build failure. The reason it matters more than a typical major version bump: 7.0 isn't just a version number increment, it's a full rewrite of the compiler itself — from TypeScript to Go, under the codename Project Corsa — shipped for the performance TypeScript's userbase has wanted for years. The removals piggyback on that rewrite as a clean break point.
What's Actually Removed
If your tsconfig.json still has any of these, TypeScript 7 will refuse to build:
target values:
es3andes5— gone. ES2015 is now the minimum target. If you genuinely need to support pre-ES2015 environments, you'll need a separate downleveling step (Babel) after TypeScript compiles, rather than relying ontscto do it.
module values:
amd,umd,systemjs, andnone— gone. Supported values narrow toESNext,ES2022,NodeNext, andCommonJS. If you're still shipping AMD or UMD bundles, that step now has to happen in your bundler (webpack, Rollup, esbuild), not intscitself.
Compiler flags, now hard errors instead of warnings:
keyofStringsOnlyimportsNotUsedAsValuesoutprependcharsetnoStrictGenericChecks
None of these were doing much useful work by 2026 — they're mostly artifacts of TypeScript's early years — but if one is sitting in an inherited tsconfig.json you haven't touched in three years, it'll stop your build cold with no warning period. You can check a tsconfig.json against this exact list with the TypeScript 7 Migration Checker.
The Compiler API Is the Real Landmine
The options above are at least loud — your build fails with a clear message pointing at the offending config line. The more disruptive break is quieter: anything that imports the TypeScript compiler as a library and walks the AST programmatically stops working, because tsgo doesn't yet expose the full "Strada" compiler API that tools like this depend on.
The most visible casualty is ts-morph — there's no workaround, since every ts-morph call maps to a Strada API call underneath, and that API isn't there yet. typescript-eslint is affected too, though the ecosystem has been actively patching around it. A stable, tgso-compatible programmatic API is targeted for TypeScript 7.1, not 7.0 — meaning if your build depends on a codegen script, a custom ESLint rule, or a documentation generator built on import * as ts from "typescript", budget time to find out whether that specific tool has caught up before you upgrade the compiler underneath it.
The Migration Order That Doesn't Leave You Debugging Blind
The advice showing up consistently in migration writeups: don't jump straight from 5.x to 7.0.
- Upgrade to TypeScript 6.0 first, on its own, and fix every deprecation warning it surfaces. This is the same list of removals above, but as warnings instead of silent hard failures — you get to see and fix them one at a time, with your existing 5.x compiler still working throughout.
- Audit your toolchain for compiler-API dependencies — grep your
package.jsonand lockfile forts-morph, check your ESLint config'stypescript-eslintversion, and check any custom build scripts thatimport * as ts from "typescript"directly. - Only then upgrade to 7.0. By this point the removed options are already gone from your config (step 1 caught them), and you know in advance which tools in your pipeline need a compatible version or a temporary workaround.
Going straight from 5.x to 7.0 means every one of these removals surfaces as a hard failure with no prior warning to guide you — technically the same end state, but a much worse debugging experience getting there.
Where This Leaves Node's Native TypeScript Support
Worth separating clearly, since the two shipped in the same rough window and get conflated: Node's built-in TypeScript support is unrelated to the Go compiler rewrite. Since Node 24 (current LTS as of late 2026), running node file.ts directly works out of the box via type stripping — a transform (powered by the amaro module, itself built on SWC) that erases TypeScript-only syntax and runs the resulting JavaScript, with zero type checking.
That means enums, parameter properties (a modifier directly on a constructor parameter), namespaces containing runtime values, and decorators don't work under plain type stripping — they need actual code generation, not just erasure, which type stripping by design doesn't do. Check a file against exactly that list with the Node.js Type-Stripping Checker.
The practical pattern most teams have landed on: use Node's native stripping for fast local iteration and one-off scripts, and still run tsc (now Go-powered, and considerably faster than before) in CI for the type checking that stripping deliberately skips.
Sources
- TypeScript 7.0 Migration Guide: Upgrade from TS 5.x to Corsa
- The TypeScript 7.0 Migration Recipe: Switching to the Go Compiler Without Breaking Your App
- TypeScript 7.0 RC: The Go Rewrite Migration Guide — SitePoint
- Three things
tsgo --noEmitwon't catch in your TypeScript 7 migration — DEV Community - Node.js Native TypeScript: The Complete Guide to Running .ts Files Without a Compiler — DEV Community
- TypeScript Without a Build Step: Native Type Stripping in Node.js