TypeScript 5.9 and the slow craft of clearer code

- Published on

TypeScript is easy to talk about as a safety tool. That is true, but incomplete.
The best TypeScript code I see is not the code with the most advanced types. It is the code where the types quietly explain the domain. A component prop tells you what the component expects. A function return type tells you what can happen. A discriminated union makes impossible states feel obviously impossible.
That is the good stuff.
TypeScript 5.9 continued the steady pattern of improving the language and tooling around it. I like those releases because they remind me that TypeScript is not one giant leap; it is a long series of small improvements that make JavaScript projects easier to maintain.
But every TypeScript project still has the same human question: are these types helping us think?
Where I see teams lose value
TypeScript starts to feel heavy when it becomes a performance of cleverness.
I have written types that were technically impressive and emotionally useless. A future developer would open the file, squint for a while, and then avoid touching it. That is not safety. That is a puzzle box.
These days I prefer types that are boring in a good way:
type ContactFormState =
| { status: 'idle' }
| { status: 'submitting' }
| { status: 'success'; message: string }
| { status: 'error'; message: string }
Nobody claps for that type, but everybody understands it. It documents the UI. It prevents weird states. It gives the next change a place to land.
That is what I want from TypeScript in 2026: less theater, more clarity. Use the new language improvements, absolutely. Keep the editor fast, keep dependencies fresh, and enjoy the better tooling. But the deeper win is still craft.
Types should make the codebase feel more like a map and less like a dare.
Worth reading: the official TypeScript 5.9 announcement.