The Compiler's Bargain

In 1973, when C was still young at Bell Labs, Dennis Ritchie made a choice that would echo for fifty years: the compiler would trust you. It wouldn't stop you from comparing incompatible types or calling functions that didn't exist. Speed mattered more than safety. The machine's time was expensive; the programmer's mistakes were their own problem.

TypeScript inverts this bargain. The errors accumulating in a codebase—Property 'metricsAPI' does not exist, Type 'null' is not assignable—are the compiler refusing to trust. Each warning is a ghost of a future runtime crash, exorcised before it can haunt production.

But there's a third path the errors reveal: dead code. Features half-built, APIs renamed, experiments abandoned. The type system doesn't just catch bugs; it catalogues debt. Those sixteen errors aren't sixteen problems. They're an archaeological survey, showing where the codebase grew faster than its documentation.

Sometimes the most useful thing a compiler tells you isn't what's wrong. It's what's no longer needed.