The TypeScript 6.0 announcement lands at a different moment than any previous major release. TypeScript 1.0 in 2014 was a pitch to skeptics. TypeScript 2.0 was the release that made the language usable for large codebases. By the time TypeScript 5.0 shipped in March 2023, the debate about whether typed JavaScript was a good idea was long over. TypeScript 6.0 arrives as something closer to a coordination point: a chance to formalize the direction the language has been drifting toward for several years.
What the Major Version Pattern Has Meant
TypeScript has used major version bumps deliberately and infrequently. Each one has signaled a meaningful shift in capability or positioning, not just a larger changelog.
TypeScript 2.0 in September 2016 introduced --strictNullChecks, making null and undefined explicit in the type system. That single flag changed how TypeScript codebases were written and is now enabled by default under --strict. TypeScript 3.0 in July 2018 brought project references, allowing large monorepos to express explicit build dependencies and get incremental compilation right. It also introduced unknown as a safer alternative to any. TypeScript 4.0 in August 2020 gave us variadic tuple types and template literal types, enabling the type-level programming model that modern TypeScript libraries depend on. TypeScript 5.0 completed the decorator story, shipping the finalized ECMAScript decorator proposal rather than the long-experimental experimentalDecorators flag, and added const type parameters, satisfies, and support for multiple configuration inheritance.
The through line across these releases is consistent: each major version either expands the expressive boundary of the type system or makes a structural change to how TypeScript fits into the JavaScript tooling ecosystem. TypeScript 6.0 does the latter, and the structural change it reflects has been building for years.
The Ecosystem Moved First
The most significant development between TypeScript 5.0 and 6.0 happened largely outside of TypeScript itself. Runtimes started executing TypeScript directly, and they did it by stripping types rather than compiling them.
Deno has supported TypeScript natively since its initial release in 2018. Bun followed with direct TypeScript execution from launch in 2022. Node.js 22.6 shipped --experimental-strip-types in mid-2024, using Amaro, a thin wrapper around the SWC parser, to strip type annotations before execution. Node.js 23 stabilized the feature further. The approach across all three runtimes is deliberately minimal: no type checking, no transformation of TypeScript-specific syntax, just erasure of annotations so the underlying JavaScript can run.
This convergence created pressure on TypeScript itself. If the ecosystem was settling on a model where types get stripped and JavaScript runs, then TypeScript features with actual runtime behavior became friction points. Enums compile to JavaScript objects with bidirectional key-value mappings. Namespaces compile to immediately-invoked function expressions. Parameter properties in class constructors are syntactic sugar that emits field assignments in the constructor body. These features require a real TypeScript compilation step, not just type erasure, and tooling that only strips types will silently mishandle them.
The --erasableSyntaxOnly compiler option addresses this directly. Under this flag, TypeScript restricts code to syntax that can be literally removed to produce valid JavaScript. The following patterns are disallowed:
// Disallowed: enum has runtime behavior
enum Direction {
Up,
Down,
Left,
Right
}
// Disallowed: namespace compiles to an IIFE
namespace Utils {
export function format(s: string) { return s.trim(); }
}
// Disallowed: parameter properties emit constructor assignments
class Point {
constructor(public x: number, public y: number) {}
}
What is allowed is everything a type-stripping tool can handle correctly: type annotations, interfaces, type aliases, generics, as expressions, and non-value uses of import type.
// Fine: interface is erased entirely
interface Config {
host: string;
port: number;
}
// Fine: type alias is erased
type Handler = (req: Request) => Response;
// Fine: generic parameters are erased
function identity<T>(x: T): T {
return x;
}
// Fine: 'as' expression is erased
const config = getConfig() as Config;
// Fine: import type leaves no runtime trace
import type { Config } from './config';
Code written under --erasableSyntaxOnly can be executed directly by Node.js 22+, Deno, Bun, or any tool built on SWC or Oxc’s type-stripping mode, with no TypeScript compilation step involved.
The TC39 Angle
This trajectory connects directly to the TC39 Type Annotations proposal, which proposes making TypeScript-style type syntax syntactically valid in JavaScript but semantically ignored at runtime, similar to how comment syntax works but with proper integration into the grammar. The proposal has been advancing through the TC39 process with meaningful support from browser vendors.
If it reaches stage 4 and ships in V8, SpiderMonkey, and JavaScriptCore, TypeScript’s erasable subset would effectively become a subset of standard JavaScript. Not a compiled language, not a transpiled language, but annotated JavaScript that any modern engine would understand and run. TypeScript would be positioned to define the canonical form of those annotations, having spent more than a decade establishing conventions and a user base.
The restriction under --erasableSyntaxOnly is worth being precise about: it narrows the syntactic surface area of TypeScript, not the expressiveness of the type system. Template literal types, conditional types, mapped types, infer in complex positions, discriminated unions, all of that is unaffected. The type system that powers libraries like tRPC, Zod, and Effect operates entirely within the erasable subset. The features that --erasableSyntaxOnly restricts are conveniences and legacy constructs, not the core of what makes TypeScript’s type system valuable.
Migration Considerations
For most application developers upgrading from TypeScript 5.x, the transition to TypeScript 6.0 will be routine. The type system is backward compatible in the ways that matter, and breaking changes follow patterns that were signaled well in advance through deprecation warnings and --verbatimModuleSyntax requirements that nudged users away from the affected patterns.
The places where the upgrade requires real attention are codebases that have relied heavily on TypeScript-specific runtime features: large enum definitions used as runtime registries, namespace-organized utilities, or class hierarchies built around parameter properties. For these patterns, TypeScript 6.0 is a forcing function to migrate toward idiomatic JavaScript equivalents. Enums become const objects with as const assertions and a derived type. Namespace modules become standard ES modules. Parameter properties become explicit field declarations.
// Replacing a runtime enum
const Direction = {
Up: 'Up',
Down: 'Down',
Left: 'Left',
Right: 'Right',
} as const;
type Direction = typeof Direction[keyof typeof Direction];
// Replacing parameter properties
class Point {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
These are not strictly worse patterns. They produce JavaScript that is readable without TypeScript knowledge and that runs correctly in any type-stripping context.
What the Version Number Signals
A major version bump in TypeScript carries weight partly because they have been rare enough to mean something. TypeScript 6.0 declares that the shift toward a type-annotation model is stable enough to build on, not experimental enough to leave behind a compatibility hedge.
For tooling authors and library maintainers, this is the more significant part of the release. TypeScript 6.0 provides a concrete baseline to target. Build tools, language server integrations, and type-checking pipelines can align on capabilities and behaviors that are now part of a stable major version. The ecosystem coordination that comes from a version boundary is real even when individual features have been available for some time.
TypeScript spent its first decade proving that typed JavaScript was worth doing. The following years pushed the type system toward things that would have looked academic in 2014. TypeScript 6.0 turns attention toward what TypeScript’s surface area should look like in a world where types are increasingly native and compilation is increasingly optional. That is a reasonable place to aim.