Choosing Between “type” and “interface” in React

Daniel Leitch
Nerd For Tech
Published in
2 min readAug 9, 2023

When I first dipped my toes into the world of development, I recall a vivid memory of discussing TypeScript with one of my seniors. Eager to understand the nuances, I asked, “When do I use a custom type versus an interface?” Without hesitation, he responded, “We always use interfaces as the default.” This advice seemed straightforward enough, and for a while, I adhered to it diligently.

However, as I delved deeper into React and wrestled with complex projects, I realized that the ‘interface as default’ approach wasn’t always fitting. My explorations and projects led me to question that initial guidance. After years navigating the React trenches and countless hours of research, I’ve come to understand that the choice between “type” and “interface” isn’t black and white. The real answer is, it depends.

If you’re wading through TypeScript with React, pondering whether to use “type” or “interface” to define your prop types, you’re not alone. In the ever-evolving landscape of React development, both have their unique advantages and applications. So, let’s embark on a journey to decipher when to use which, and why.

Use Cases for “type”

- Union Types: This allows a value to be one of several types. An ideal use case for situations where a value might have multiple forms.

 type ButtonProps = {
label: string
onClick: () => void
} | null
  • Intersection Types: Perfect for when you want to combine multiple types.
type Named = {
name: string
}

type Aged = {
age: number
}

type Person = Named & Aged
  • Tuple Types: Useful for arrays with a fixed number of elements of specific types.
type Response = [Boolean, string]

- Type Operators: Unique features like keyof, typeof, and in aren’t available on interfaces.

Use Cases for “interface”

  • Extendibility: Interfaces excel at being extensible. They’re fantastic for React component props when building extensible libraries or components.
interface ButtonProps {
label: string
onClick: () => void
}

interface IconButtonProps extends ButtonProps {
icon: string
}

- Declaration Merging: Automatically merge multiple interface declarations with the same name.

interface User {
name: string
}

interface User {
age: number
}

- Clearer Intent for Objects: A reader sees an interface and immediately recognizes an object’s shape, ideal for React components.

Performance Insights

You might wonder, is there a performance difference between these two? In TypeScript, “type” and “interface” are design-time constructs, and they don’t exist in the transpiled JavaScript. Thus, there’s no performance difference between them.

Readability and Developer Experience

While some developers resonate with the clarity of interfaces due to their background in OOP languages, TypeScript’s `type` has its own charm, particularly for complex type relationships.

Conclusion

When working on React projects:

- Start with `interface` for React component prop types, considering its extensibility and clear indication of an object shape.

- For intricate type manipulations or when utilizing unions, intersections, etc., go for `type`.

The main thing is to maintain consistency in your project or team. Discuss, decide on a convention, and then stick with it.

Happy coding!

--

--

Daniel Leitch
Nerd For Tech

I'm a Front-end Developer 🚀 and Linux Enthusiast