Everyday Types in TypeScript: Making Typing Less Typing 😅

Everyday Types in TypeScript: Making Typing Less Typing 😅

·

5 min read

Simplifying TypeScript Types: Less Typing, More Coding 🚀

If you’ve ever written JavaScript and thought, "Wouldn’t it be nice if this thing caught errors before I hit refresh and the whole browser cried?" Well, congratulations—you’re about to fall in love with TypeScript! Here’s a fun, semi-professional dive into some essential types you’ll meet in TypeScript. 💻✨

1️⃣ Static vs. Dynamic Typing

Think of TypeScript as your overachieving teammate who checks everything twice (static typing) versus JavaScript, your chill buddy who just wings it (dynamic typing).

  • TypeScript: “Are you sure this is a number? Looks like a string to me. Fix it before we continue.”

  • JavaScript: “Oh, you wanna assign 42 to a variable that was hello? Cool, do your thing. I’ll complain later at runtime.”

Example:

const add = (a: number, b: number) => a + b; // Explicitly typed arguments
console.log(add(30, 5)); // 35
// console.log(add('30', 5)); // ❌ Error: 'string' is not assignable to 'number'

Lesson: Static typing is the friend who stops you from sending that embarrassing text. Use it.

2️⃣ Type Assignment vs. Type Inference

TypeScript is like your personal detective 🕵️‍♂️ when it comes to types, making sure everything’s in place.

  • Type Assignment: You tell TypeScript exactly what type a variable is, leaving no room for mystery.

      let name: string = "Hassani"; // "Hassani" is strictly a string
    
  • Type Inference: TypeScript is like, "I got this, I know what you mean." It can often figure out the type on its own.

      let age = 25; // Inferred as a number based on the value
      age = 'oops'; // ❌ Error: Type 'string' is not assignable to 'number'
    

Pro tip: Be explicit when it matters (e.g., function signatures), but don’t micromanage TypeScript—it’s already smart enough! 🤖

3️⃣ Objects: Blueprints for the Organized

Objects are like blueprints that ensure you only put the right pieces in place. It’s like telling your code, “This box will only fit these shapes, don’t mess it up!”

  • Explicit Typing:

      type User = { name: string; age: number };
      const user: User = { name: "Hassani", age: 25 }; // Clear structure
    
  • Type Inference: TypeScript can figure it out by itself, but it’s always safer to be explicit when possible.

      const user = { name: "Hassani", age: 25 }; // Inferred as { name: string; age: number }
    

Tip: Use explicit types when you want to create reusable, well-defined blueprints. They help keep your code neat and predictable. 🍪

4️⃣ Arrays & Tuples: Chaos vs. Control

Arrays are fun but chaotic—like a mix of socks in your drawer. Tuples are like saying, “Let’s keep it neat, people!”

  • Arrays:
    Arrays are flexible—good for lists where you might not care about the number of items.

      let fruits: string[] = ["Apple 🍎", "Kiwi 🥝"];
      fruits.push("Cherry 🍒"); // Allowed
    
  • Tuples: Tuples are like fixed-length arrays—perfect for when you need specific positions with exact types.

      const person: [string, number] = ["Hassani", 25];
      person[0] = "Alice"; // Allowed
      person.push(100); // Surprise: ["Alice", 25, 100]  
      // person[2] = 'oops'; // ❌ Error
    

Tuples are your go-to for predictable data structures. Arrays? A bit more freestyle. 🎸

5️⃣ Enums: Friendly Names for Constant Values

Enums are like labels that make constant values easier to understand. It’s like having stickers on your laptop to remind you of important things.

Example:

enum TrafficLight {
  Red = "STOP", 
  Yellow = "SLOW", 
  Green = "GO",
}

console.log(TrafficLight.Red); // "STOP"

Enums help you avoid hardcoding values like 1, 2, or 3, making your code more readable and clear. It’s less like, “What’s this 3 mean again?” and more like, “Oh, it’s a red light!” 🚦

6️⃣ Unions & Literal Types: Flexible, Yet Specific

Unions give you more flexibility, like a coffee order: “I’ll take this or that, but nothing else.” Literal types are similar but more specific—like saying, “Only this size, please.”

  • Union Types:
    You can allow multiple types, like mixing and matching toppings on a pizza.

      function addOrConcat(a: number | string, b: number | string) {
        return typeof a === "number" && typeof b === "number" 
          ? a + b 
          : `${a}${b}`;
      }
      console.log(addOrConcat(5, 10)); // 15
      console.log(addOrConcat("Hello, ", "World!")); // "Hello, World!"
    
  • Literal Types:
    You limit the values to a specific set, like choosing only certain toppings on your pizza.

      type Status = "success" | "error" | "pending";
      function handleStatus(status: Status) {
        console.log(`Status: ${status}`);
      }
      handleStatus("success"); // Works  
      // handleStatus("failed"); // ❌ Error
    

Unions = Flexibility.
Literals = Flexibility with boundaries. 🍕

7️⃣ Any: The Wild Card 🃏

The any type is like that unpredictable friend who’s always a blast… until things go wrong. Use it sparingly—don’t let it run wild in your code!

let wild: any;
wild = 42; // Okay
wild = "Hello!"; // Okay
wild = [1, 2, 3]; // Okay

While it’s tempting to go wild with any, overusing it means TypeScript can’t protect you from errors. It’s like taking the safety net away. 🚫

Closing Thoughts

TypeScript’s everyday types aren’t just about strict rules; they’re your safety net against spaghetti code nightmares. 🕸️ Sure, there’s a bit of upfront work, but the peace of mind? Priceless.

So go forth, TypeScript in hand, and type like a pro. Because if you don’t, TypeScript will catch you slipping anyway. 😏

That’s all for today! Got questions, tips, or jokes? Drop them below or tweet me @Hassani. Let’s type smarter, not harder! 😉

References 📚