In TypeScript, both interfaces and types are used to define custom data structures and enforce type checking. They are often used interchangeably, but there are some differences between them.
#1. Interfaces
Interfaces are a way to define object shapes and contracts in TypeScript. They are commonly used for defining the structure of objects and ensuring that an object meets specific requirements.
interface Person {
name: string;
age: number;
}
const person: Person = {
name: 'John',
age: 30,
};
In this example, we define an interface called Person
, specifying that objects of this type must have a name
property of type string
and an age
property of type number
. The variable person
must conform to the Person
interface, ensuring that it contains the required properties.
#2. Types
Types in TypeScript provide a more general way to define custom types, not just for objects. They can be used for defining unions, intersections, and other complex types.
type UserRole = 'admin' | 'editor' | 'viewer';
type User = {
name: string;
age: number;
role: UserRole;
};
In this example, we create a type UserRole
, which is a union of three string literals: 'admin'
, 'editor'
, and 'viewer'
. Then, we define a type User
, which consists of three properties: name
of type string
, age
of type number
, and role
of type UserRole
.
#3. Extending Interfaces and Intersection Types
One of the key differences between interfaces and types is the ability to extend interfaces and create intersection types.
interface Shape {
color: string;
}
interface Circle extends Shape {
radius: number;
}
type FilledCircle = Circle & { filled: boolean };
In this example, we create an interface Shape
with a color
property. We then define an interface Circle
that extends Shape
and adds a radius
property. Finally, we create a type FilledCircle
, which is an intersection of Circle
and an object with a filled
property of type boolean
.
#4. Declaration Merging
Interfaces support declaration merging, allowing you to extend existing interfaces and merge them into a single definition.
interface Car {
brand: string;
}
interface Car {
model: string;
}
const myCar: Car = {
brand: 'Toyota',
model: 'Corolla',
};
In this example, we have two interface declarations for Car
, but TypeScript merges them into a single definition. This is useful when working with third-party libraries or when you want to add additional properties to an existing interface.
0 Comment