TypeScript 6.0 is your final warning

Issue #473.March 27, 2026.2 Minute read.
Bytes

Today’s issue: The Spider-Man of package managers, WebAssembly heresies, and the curious case of the missing Zeit cofounder.

Welcome to #473.


Eyeballs logo

The Main Thing

Girl in a club with a rainbow around her and light shooting out of her body

TypeScript's codebase breaking free of JavaScript

TypeScript 6.0 is your final warning

Much like my last job as a Chili’s bartender, Monday’s TypeScript 6.0 release is more of a transition phase than a final destination. A bridge to a better place.

That’s because this is the last TypeScript version built on its existing JavaScript codebase, before it graduates to its fancy new Go compiler and language service that promises native speed and multi-threaded type checking.

That means TypeScript 6.0 is basically a polite way of saying “please update your tsconfig before we blow everything up in TypeScript 7.0 in a few months.” (SemVer is a social construct at Microsoft.)

Strict mode is now true by default, module defaults to esnext, target floats to the current-year ES spec (currently es2025), and types now defaults to an empty array instead of vacuuming up everything in node_modules/@types. That last one alone will break a lot of projects, but should also speed them by 20–50%.

Here’s what else landed:

  • Temporal API types — From reading this newsletter, you already know the long-awaited Temporal proposal just hit stage 4, and TypeScript 6.0 ships built-in types so you can start using it today with --target esnext.

  • Map.getOrInsert — The ECMAScript “upsert” proposal also hit stage 4, adding getOrInsert and getOrInsertComputed to Map and WeakMap. This collapses the classic has/set/get pattern into one clean call.

  • Deprecation tsunami — Lots of spring cleaning, with outFile, baseUrl, --moduleResolution node, target: es5, and AMD/UMD/SystemJS module targets all gone or on death row.

Bottom Line: It’s officially the end of an era for TypeScript’s codebase. The new era should be faster and better in pretty much every way, but I’ll still make sure to pour out a Presidente Margarita to honor the OG.


Microsoft logo

Our Friends
(With Benefits)

Copilot CLI

GitHub Copilot: Accelerate Your Software Innovation

GitHub Copilot is your agentic AI coding partner that works across your editor, the command line, and GitHub, bringing real project and codebase context into your workflow. Get real‑time code suggestions, stay in flow, and offload tasks like spec‑driven development, test generation, documentation, and app modernization.

Whether you’re shipping a new feature or migrating an existing app, GitHub Copilot helps you move faster with less overhead, so you can focus on solving real problems. Get started for free


Spot the Bug logo

Spot the Bug

Sponsored by Datadog

Datadog’s free Front-end Developer Kit gives you instant access to three killer resources that help you understand your users and troubleshoot issues effectively.

We usually try to keep these 🍦 JavaScript, but here’s one for you React devs this week.

import { useState } from 'react';

export default function Counter() {
  const [number, setNumber] = useState(0);

  return (
    <>
      <h1>{number}</h1>
      <button onClick={() => {
        setNumber(number + 1);
        setNumber(number + 1);
        setNumber(number + 1);
      }}>Increment</button>
    </>
  )
}

Cool Bits logo

Cool Bits

  1. Pierce Boggan wrote about how the VS Code team builds VS Code with AI. Sadly, we didn’t get any details about how they trick their bosses into thinking that they actually use Copilot.

  2. Andrew Nesbitt wrote about the top 10 biggest conspiracies in open source, and he didn’t even mention how the original Zeit cofounder was just deployed to Iran.

  3. Kyle Tryon wrote the definitive guide to choosing a JavaScript logging library in 2026, including why Sentry’s runtime-agnostic logger stands out as the best new entry. We might be a little biased, but we definitely agree. [sponsored]

  4. Sugar High is a super lightweight syntax highlighter for JavaScript and JSX, which reminds me that it’s been almost 45 minutes since my last pack of Sour Patch Kids Watermelons.

  5. Neciu Dan gave some unsolicited advice on why you should start naming your useEffect functions. The best advice is always unsolicited, as my dad would say.

  6. Expo just shipped real Jetpack Compose and SwiftUI in React Native. So you get the same components, same behavior, and same platform polish as native developers - but all in React Native. [sponsored]

  7. The Thesys engineering team wrote about how rewriting their Rust Wasm parser in TypeScript made it 3x faster, and they were never heard from again.

  8. pnpm 11 beta just dropped, but I gotta say that this preview wasn’t quite as exciting as the new sad-boi SpiderMan one.

  9. Zero 1.0 is the first stable release of Rocicorp’s local-first sync engine for web apps.

  10. Addy Osmani wrote about Comprehension Debt, which he calls “the hidden cost of AI generated code.” I always thought that term referred to my ability to only read at a 5th-grade level, but I’m proud to announce I finally finished the first Diary of a Wimpy Kid book.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Datadog

You might expect that clicking the button would increment our number state by 3, but that’s not how it works. In short, JavaScript creates a closure around the number variables so it’s as if we’re doing

setNumber(0 + 1);
setNumber(0 + 1);
setNumber(0 + 1);

which of course will always set number to 1.

Instead, if we want to update the same state multiple times before the next render, we can pass a function to our setter function like so -

setNumber(n => n + 1);
setNumber(n => n + 1);
setNumber(n => n + 1);

Now React will add all these functions to a queue, and during the next render, React goes through the queue passing the result from the previous item in the queue to the next, eventually leading to a number of 3.

0 + 1 = 1
1 + 1 = 2
2 + 1 = 3