Taming TypeScript

The TypeScript Tutorial for The Hater

The `any` Escape Hatch (and Why It's a Trap)

"I give up, just let me code!"

At some point in your TypeScript journey, you will be tempted. You'll have a complex value from a library, or a weird data structure, and you won't be able to figure out the type. The red squiggles will mock you.

In that moment of frustration, you'll discover the escape hatch: any.

The any type is TypeScript's way of saying, "I trust you. Do whatever you want with this value. I'll look the other way." It effectively turns off the type checker for that specific variable.

It seems like a perfect solution. But it's a trap.

What any Really Does

When you type a variable as any, you are telling TypeScript to discard all type information. You can assign anything to it, and you can access any property on it, whether it exists or not.

Exercise 1: The Danger Zone

  1. The variable myVariable is typed as any.
  2. Notice that there are no errors, even though we are reassigning it to different types and calling a method that doesn't exist (.gibberish()).
  3. This code will crash at runtime. any has silenced the TypeScript compiler, which is supposed to be helping us.
Interactive Editor
Loading...

Using any is like taking off your seatbelt because it's uncomfortable. It feels freeing for a moment, but you lose all the protection that was the entire point of using TypeScript in the first place.

any is Infectious

The real danger of any is that it spreads. If you have an any value and you pass it to a function, or use it in an expression, the result of that expression will often also be any. The type safety "off switch" propagates through your code.

function logValue(val: any) {
  // Because 'val' is 'any', this is allowed.
  // But what if 'val' is a number? This will crash.
  console.log(val.toUpperCase());
}

// This will crash at runtime, with no warning from TypeScript.
logValue(123);

A single any can poison a large part of your application, re-introducing the very same runtime errors TypeScript was designed to prevent.

When (If Ever) Should You Use any?

The pragmatic answer is: almost never.

Your goal should always be to describe your data. If you have a complex object from a library, take a moment to define a type or interface for the parts you care about. If you truly don't know the type of something, there is a much safer alternative that we will cover in the very next lesson.

Using any is an admission of defeat. It's a sign that you have a hole in your type coverage. While it might be a necessary evil when first migrating a very large, old JavaScript codebase, in modern TypeScript development, it should be avoided at all costs. The first step to taming TypeScript is to tame your usage of any.