runtime.boot

Full Stack Systems
Production Mindset

CodeWithMihir

Engineering thoughtful products from interface to infrastructure.

CodeWithMihir

TypeScript Tutorial

TypeScript Interface vs Type Explained

Understand the difference between interface and type in TypeScript, including objects, unions, intersections, declaration merging, and practical usage.

Welcome back! I am Mihir, and in this lesson we will compare interface vs type in TypeScript.

Both can describe object shapes, but they are not exactly the same.


Similarity: Both Can Describe Objects

Using interface:

interface User {
  id: number;
  name: string;
}

Using type:

type User = {
  id: number;
  name: string;
};

For simple object shapes, both work well.


Interfaces Can Extend Interfaces

interface Person {
  name: string;
}

interface Employee extends Person {
  employeeId: number;
}

Employee includes all properties from Person.


Types Can Use Intersections

type Person = {
  name: string;
};

type Employee = Person & {
  employeeId: number;
};

This gives a similar result using &.


Types Can Represent Unions

This is where type is often better.

type Status = "pending" | "success" | "failed";

An interface cannot directly represent this kind of union.

You cannot write:

interface Status = "pending" | "success";

So for unions, use type.


Types Can Name Primitives

type UserId = number;
type Email = string;

Interfaces are for object-like structures, not primitive aliases.


Interfaces Can Merge

Interfaces with the same name are merged.

interface Config {
  theme: string;
}

interface Config {
  language: string;
}

const config: Config = {
  theme: "dark",
  language: "en",
};

This can be useful when extending library types.


Type Aliases Cannot Merge

type Config = {
  theme: string;
};

type Config = {
  language: string;
};

This causes an error because a type alias name can only be declared once in the same scope.


Which One Should You Use?

Use interface when:

  • you are describing object shapes
  • you expect extension
  • you are working with class contracts
  • you want declaration merging

Use type when:

  • you need unions
  • you need primitive aliases
  • you need tuple aliases
  • you are composing complex types

Practical Rule

For beginners, this rule works well:

// Object shape
interface User {
  id: number;
  name: string;
}

// Union or helper type
type Status = "loading" | "success" | "error";

This keeps your code predictable.


Quick Recap

  • interface and type can both describe objects.
  • type is better for unions, primitives, tuples, and complex compositions.
  • interface supports declaration merging.
  • There is no single winner; choose based on the job.

Next up, we will learn Extending Interfaces → in more detail.