In the world of TypeScript, interfaces hold a crucial place in ensuring code integrity and scalability. They play an essential role in typing, enforcing specific structures on objects, and facilitating code autocompletion and validation in various IDEs. This article will explore TypeScript interfaces, their significance, and various related aspects.
Table of Contents
- Introducing Interfaces
- Readonly and Optional Interface Properties
- Interface Methods
- Interface Method Parameters
- Reopening Interfaces
- Extending Interfaces
- Interface Multiple Inheritance
- Interfaces vs. Type Aliases
- Conclusion
Introducing Interfaces
An interface in TypeScript is an abstract type, defining the contract for classes. It confirms that an object meets a certain standard or contains certain properties with specific types. An interface lets you guarantee that a class or object has certain properties or methods.
To start with, let’s look at a simple example to define an interface. Let’s imagine you’re creating a record for a student. Each student object must have specific properties like name
, age
, grade
, etc. An interface for a student can be created like so:
interface Student {
name: string;
age: number;
grade: string;
}
Code language: CSS (css)
Here’s a guide on setting up TypeScript to help you try these examples.
Readonly and Optional Interface Properties
Interface properties can be modified to accommodate the needs of specific applications. In TypeScript, properties can be labelled as readonly or optional using readonly and ? modifier respectively.
A readonly property is one that cannot be changed after it gets initialized. Let’s modify the “Student” interface to include a readonly “id” property:
interface Student {
readonly id: number;
name: string;
age: number;
grade: string;
}
Code language: PHP (php)
On the other hand, optional properties are those which might or might not receive a value during object creation. Adding a “?” sign after a property makes it optional:
interface Student {
readonly id: number;
name: string;
age: number;
grade?: string;
}
Code language: PHP (php)
Interface Methods
An interface is not just limited to the properties of an object. It can also specify the methods that should exist in that object. Just like we define method signatures in Java or C# interfaces, TypeScript allows us to do the same.
interface Student {
readonly id: number;
name: string;
age: number;
grade?: string;
getGrade(): string;
}
Code language: PHP (php)
Here’s a guide to further understand TypeScript functions.
Interface Method Parameters
We can go even further by enforcing the types of the parameters that methods in the implementing object should accept. TypeScript allows specifying parameter types in the method signature within an interface.
interface Student {
readonly id: number;
name: string;
age: number;
grade?: string;
getGrade(): string;
setGrade(grade: string): void;
}
Code language: PHP (php)
Reopening Interfaces
You may extend an existing interface by reopening it. This technique can be beneficial if you need to add a few properties or methods to an existing interface on the fly.
interface Student {
readonly id: number;
name: string;
age: number;
}
// Reopen Student interface
interface Student {
grade: string;
}
Code language: PHP (php)
Extending Interfaces
The “extends” keyword is used to inherit properties from one interface to another. This concept is similar to class inheritance.
interface Person {
name: string;
age: number;
}
interface Student extends Person {
grade: string;
}
Code language: CSS (css)
Here’s a guide to further understand TypeScript tuples and enums.
Interface Multiple Inheritance
TypeScript also allows an interface to extend multiple interfaces. It serves a large benefit, allowing a single entity to adhere to multiple contracts.
interface Person {
name: string;
}
interface Learner {
assignments: string[];
}
interface Student extends Person, Learner {
grade: string;
}
Code language: CSS (css)
Interfaces vs. Type Aliases
While both interfaces and Type aliases help to create custom type definitions, there are minute differences. Type
is generally used when you need to create complex types like union, tuple, etc. The interface is used when you have an object with properties and methods. Interface also supports multiple declarations that are merged, and Type doesn’t support multiple declarations.
Conclusion
TypeScript provides a powerful way of ensuring object structure adherence through interfaces. With optional, readonly properties, interface methods, reopening, extending, and multiple inheritance capabilities, TypeScript interfaces provide a robust way to work with complex, large-scale TypeScript projects. TypeScript interfaces, when used correctly, offer a solid foundation for more maintainable, scalable, and robust codebases. Whether you are building a small or enterprise-level application, TypeScript interfaces offer a myriad of benefits and should be a part of every developer’s toolset.