DEV Community

Cover image for Type Vs Interface in Typescript
Willian Novaes
Willian Novaes

Posted on

Type Vs Interface in Typescript

Type vs. Interface in TypeScript: What's the Difference?

Hey everyone!

Lately, I've been digging deeper into TypeScript, and I thought I'd share some insights on a topic that often confuses many of us: the difference between type and interface. If you've ever wondered when to use one over the other, you're not alone!

🔍 So, what's the deal?

Both type and interface allow us to define custom types in TypeScript, but they have their own unique features and use cases. Here's a breakdown:


📝 Type Aliases (type)

What are they?

  • Think of type as a way to give a name to any type. This could be a primitive, a union, a tuple, an object, or even a function type.

Pros:

  • Versatility with Complex Types: Perfect for defining unions and intersections.
  type Status = "success" | "error" | "loading";
Enter fullscreen mode Exit fullscreen mode
  • Primitives and Tuples: You can alias primitive types, tuples, and more.
  type Point = [number, number];
Enter fullscreen mode Exit fullscreen mode
  • Advanced Type Features: Great for mapped types and conditional types.

Cons:

  • No Declaration Merging: Unlike interfaces, you can't reopen a type alias and add new properties later.
  • Less OOP-Friendly: Types can't be implemented by classes or extended in the same way interfaces can.

📐 Interfaces (interface)

What are they?

  • Interfaces are primarily used to describe the shape of objects, including their properties and methods.

Pros:

  • Extensibility: You can extend interfaces or even merge them. This is super handy for large codebases.
  interface User {
    name: string;
  }

  interface User {
    age: number;
  }
  // User now has both name and age properties
Enter fullscreen mode Exit fullscreen mode
  • Class Implementation: Ideal for object-oriented patterns. Classes can implement interfaces.
  interface Drivable {
    drive(): void;
  }

  class Car implements Drivable {
    drive() {
      // implementation
    }
  }
Enter fullscreen mode Exit fullscreen mode

Cons:

  • No Union Types: Interfaces can't define union types directly.
  • Limited with Primitives and Tuples: Not suitable for aliasing these types.

🤔 So, which one should you use?

Use type when:

  • Defining complex types like unions and intersections.
  • Working with primitives, tuples, or function types.
  • You need advanced type manipulation.

Use interface when:

  • Defining the shape of an object or class.
  • You might need to extend or merge types later on.
  • Following object-oriented design patterns.

💡 My Two Cents

Personally, I lean towards using interface for defining objects and classes because I appreciate the extensibility. For everything else, especially when dealing with unions or more complex types, type is my go-to.

But that's just me! What's your experience? Do you have a preference between type and interface in TypeScript? I'd love to hear your thoughts and any tips you might have.

Feel free to share in the comments below! 👇

Top comments (0)