TypeScript 6.0 landed on March 23, and if you upgrade without reading the changelog, your CI will break. Not "might break" — will. The new defaults flip strict to true, target to ES2025, and moduleResolution to bundler. If your tsconfig relies on inherited defaults (most do), you're in for a morning of red squiggles.

But the defaults are just the surface. This release is really about one thing: clearing the runway for TypeScript 7.0, the Go-native rewrite that promises dramatically faster builds through parallel type checking. TypeScript 6.0 is the last version built on JavaScript, and it knows it. Every deprecation in this release is a feature that won't survive the port.

Every default just moved

Here's what changed if you don't set these explicitly:

Setting 5.x Default 6.0 Default
strict false true
target es2020 es2025
module commonjs esnext
moduleResolution node10 bundler
types all @types/* [] (none)
rootDir inferred from source "." (config dir)
esModuleInterop false true

The types: [] change is the sneakiest. If you're not explicitly listing "types": ["node"] in your tsconfig, you'll get "Cannot find name 'process'" errors the moment you upgrade. TypeScript no longer auto-discovers @types packages from node_modules.

The rootDir change is the one that'll confuse you most. Files that compiled to dist/index.js now land at dist/src/index.js because the compiler defaults to the config file's directory instead of inferring from your source tree. Fix both immediately:

{
  "compilerOptions": {
    "types": ["node"],
    "rootDir": "./src"
  }
}

Fourteen deprecations, one message

The list is long, but the message is simple: if it doesn't work in Go, it's gone.

The big ones:

  • target: es5 — Lowest target is now ES2015. Still shipping ES5? You need a separate transpiler.

  • --moduleResolution node (a.k.a. node10) — Use nodenext or bundler.

  • --moduleResolution classic — Removed entirely. Nobody's used it since 2018.

  • --outFile — Use a real bundler.

  • --baseUrl — Inline the values into your paths entries.

  • module Foo {} syntax — It's namespace Foo {}. Has been for years. This enforces it.

  • Import assertionsimport ... assert {} becomes import ... with {}.

You can buy time with "ignoreDeprecations": "6.0" in tsconfig. This suppresses warnings and keeps everything working. But TypeScript 7.0 hard-removes these options. No escape hatch.

The import syntax shift

With esModuleInterop defaulting to true, the old CommonJS interop pattern changes:

// Before (esModuleInterop: false)
import * as express from "express";
import * as React from "react";

// After (now the default)
import express from "express";
import React from "react";

Both forms still compile. But the namespace import pattern will feel increasingly like dead code in new projects.

Fix your path aliases

If you used baseUrl to set up path aliases, inline the base into each path entry:

// Before (5.x)
{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": { "@app/*": ["app/*"], "@lib/*": ["lib/*"] }
  }
}

// After (6.0+)
{
  "compilerOptions": {
    "paths": { "@app/*": ["./src/app/*"], "@lib/*": ["./src/lib/*"] }
  }
}

Or skip the manual work — ts5to6 handles this automatically:

npx ts5to6 --baseUrl   # fixes baseUrl + paths
npx ts5to6 --rootDir   # fixes rootDir inference

Handles monorepos and tsconfig inheritance chains too.

One flag worth knowing about

--stableTypeOrdering is a new flag that forces the compiler to produce union types in a deterministic order matching TypeScript 7.0's Go-based output. Useful for diffing .d.ts files between versions during migration testing.

The catch: ~25% performance hit. Use it to validate, then remove it.

What's actually coming

TypeScript 7.0 is reportedly close to completion. The Go rewrite enables parallel type checking and shared-memory multithreading — the kind of gains that make a 100k-line codebase feel like a 10k-line one.

The play: upgrade to 6.0 now, fix every deprecation warning, run ts5to6 on your configs, and you'll be ready when the native compiler drops. Ignore the warnings and you're looking at a forced migration later — one without ignoreDeprecations to soften the landing.