Typescript Implementing Interfaces In Classes Complete Guide

 Last Update:2025-06-22T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    7 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of TypeScript Implementing Interfaces in Classes

TypeScript Implementing Interfaces in Classes

Interfaces in TypeScript: Interfaces in TypeScript are blueprints for classes, defining the structure that class instances must adhere to. They can include properties and methods declarations. Interfaces enable you to enforce strict structure on your objects and enhance the readability and consistency of your code.

Implementing Interfaces in Classes: When a class implements an interface, it commits to fulfilling the contract defined by that interface. This means that the class must implement all of the interface's methods and properties, ensuring a consistent structure and behavior across your codebase.

Detailed Steps on Implementing Interfaces in Classes:

  1. Define the Interface: Start by defining the interface, specifying the properties and methods that any class implementing the interface should have.

    interface Vehicle {
        brand: string;
        startEngine(): void;
        stopEngine(): void;
    }
    
  2. Create a Class that Implements the Interface: Use the implements keyword to declare that a class is implementing a particular interface.

    class Car implements Vehicle {
        brand: string;
    
        constructor(brand: string) {
            this.brand = brand;
        }
    
        startEngine(): void {
            console.log(`The engine of the ${this.brand} car has started.`);
        }
    
        stopEngine(): void {
            console.log(`The engine of the ${this.brand} car has stopped.`);
        }
    }
    
  3. Instantiate and Use the Class: You can now create instances of the class and use its methods, ensuring they conform to the interface.

    const myCar = new Car("Toyota");
    myCar.startEngine();  // Output: The engine of the Toyota car has started.
    myCar.stopEngine();   // Output: The engine of the Toyota car has stopped.
    
  4. Enforcement of Interface Contract: TypeScript strictly enforces that classes comply with the interface contract. If a class does not implement all the required members, TypeScript will throw a compile-time error.

    class Motorbike implements Vehicle {
        // Error: Property 'stopEngine' is missing in type 'Motorbike' but required in type 'Vehicle'.
        startEngine(): void {
            console.log("The engine of the motorbike has started.");
        }
    }
    

Important Points:

  • Readability: Interfaces improve the readability of the code by clearly defining expected behavior.
  • Consistency: They ensure that all classes implementing an interface have a consistent set of properties and methods, reducing bugs and making maintenance easier.
  • Type Safety: TypeScript uses interfaces to enforce type safety, catching errors during compile-time rather than at runtime.
  • Flexibility: Interfaces can be extended to create more specialized contracts, and classes can implement multiple interfaces at once.
  • Optional Members: Interfaces can include optional members using the ? modifier, allowing flexibility while still providing a base structure.

Example of Extending Interfaces:

interface ElectricVehicle extends Vehicle {
    batteryLevel: number;
    chargeBattery(): void;
}

class Tesla implements ElectricVehicle {
    brand: string;
    batteryLevel: number;

    constructor(brand: string, batteryLevel: number) {
        this.brand = brand;
        this.batteryLevel = batteryLevel;
    }

    startEngine(): void {
        console.log(`The engine of the ${this.brand} has started.`);
    }

    stopEngine(): void {
        console.log(`The engine of the ${this.brand} has stopped.`);
    }

    chargeBattery(): void {
        console.log(`Charging the ${this.brand}'s battery.`);
    }
}

Conclusion: Implementing interfaces in TypeScript classes is a powerful way to enforce a consistent structure and behavior across your codebase. It provides transparency, type safety, and enables more effective code maintenance. By using interfaces effectively, you can build robust and scalable applications that adhere to well-defined contracts.


Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement TypeScript Implementing Interfaces in Classes

Example 1: Basic Interface Implementation

Step 1: Define an Interface

An interface in TypeScript is a blueprint for the structure of an object. Let's define a simple interface called Vehicle.

interface Vehicle {
    brand: string;
    year: number;
    startEngine(): void;
}

In this example, Vehicle defines three members:

  • brand: a property of type string.
  • year: a property of type number.
  • startEngine(): a method that doesn't return anything (it has a return type of void).

Step 2: Create a Class that Implements the Interface

Now, let's create a class Car that implements the Vehicle interface.

class Car implements Vehicle {
    brand: string;
    year: number;

    constructor(brand: string, year: number) {
        this.brand = brand;
        this.year = year;
    }

    startEngine(): void {
        console.log("Engine started!");
    }
}

Here, we have:

  • Defined a Car class that uses the implements keyword to implement the Vehicle interface.
  • Implemented the required properties (brand and year) and method (startEngine()).
  • Added a constructor to initialize the properties.
  • Provided the implementation for the startEngine method.

Step 3: Instantiate the Class

You can now create an instance of the Car class and use its methods.

const myCar = new Car('Toyota', 2021);
console.log(myCar.brand); // Output: Toyota
console.log(myCar.year);  // Output: 2021
myCar.startEngine();      // Output: Engine started!

Example 2: Interface with Optional Properties and Methods

Let's define an interface with some optional properties and methods. This will show you how you can add flexibility to your object structures.

Step 1: Define an Interface with Optional Members

interface Vehicle {
    brand: string;
    year?: number; // Optional property using '?'
    startEngine(): void;
    stopEngine?(): void; // Optional method using '?'
}

Step 2: Create a Class that Implements the Interface with Optional Members

class Bike implements Vehicle {
    brand: string;

    constructor(brand: string) {
        this.brand = brand;
    }

    startEngine(): void {
        console.log("Bike engine started!");
    }

    stopEngine(): void { // Optional method implemented here
        console.log("Bike engine stopped!");
    }
}

class Scooter implements Vehicle {
    brand: string;
    year: number;

    constructor(brand: string, year: number) {
        this.brand = brand;
        this.year = year;
    }

    startEngine(): void {
        console.log("Scooter engine started!");
    }
    
    // Note: stopEngine isn't implemented because it's optional
}
  • The Bike class implements both startEngine() and the optional stopEngine().
  • The Scooter class also provides a value for the optional property year, but does not implement the optional stopEngine() method.

Step 3: Use the Instances

const myBike = new Bike('Giant');
console.log(myBike.brand);       // Output: Giant
myBike.startEngine();            // Output: Bike engine started!
myBike.stopEngine();             // Output: Bike engine stopped!

const myScooter = new Scooter('Yamaha', 2018);
console.log(myScooter.brand);    // Output: Yamaha
console.log(myScooter.year);     // Output: 2018
myScooter.startEngine();         // Output: Scooter engine started!

// Note: myScooter.stopEngine() would give a compile-time error if uncommented

Example 3: Interface Extending Another Interface

Sometimes you might want one interface to inherit from another. Here's how interfaces can extend each other.

Step 1: Define Base Interfaces

interface Engine {
    startEngine(): void;
    stopEngine?(): void;
}

interface Wheels {
    numberOfWheels: number;
}

Step 2: Combine Interfaces

Now, let's create a vehicle interface that extends both Engine and Wheels.

interface Vehicle extends Engine, Wheels {
    brand: string;
    year: number;
    drive(): void;
}

Step 3: Implement the Combined Interface in a Class

Let's create a Truck class that implements the Vehicle interface.

class Truck implements Vehicle {
    brand: string;
    year: number;
    numberOfWheels: number;

    constructor(brand: string, year: number, numberOfWheels: number) {
        this.brand = brand;
        this.year = year;
        this.numberOfWheels = numberOfWheels;
    }

    startEngine(): void {
        console.log("Truck engine started!");
    }

    stopEngine(): void {
        console.log("Truck engine stopped!");
    }

    drive(): void {
        console.log("Drive truck with", this.numberOfWheels, "wheels");
    }
}

Step 4: Use the Instance

Top 10 Interview Questions & Answers on TypeScript Implementing Interfaces in Classes

Top 10 Questions and Answers: Implementing Interfaces in Classes with TypeScript

An interface in TypeScript is a contract that defines a structure or blueprint for objects. It declares the syntax for classes to follow, detailing the properties and methods a class must implement. Interfaces are not compiled into JavaScript; rather, they are used during development to provide type-checking and a better development experience.

When a class implements an interface, it must adhere to the structure defined by that interface, ensuring consistency across classes that perform similar functionalities.

2. How do you implement an interface in a TypeScript class?

To implement an interface in a TypeScript class, use the implements keyword followed by the name of the interface. For example:

interface Animal {
    name: string;
    makeSound(): void;
}

class Dog implements Animal {
    name: string;

    constructor(name: string) {
        this.name = name;
    }

    makeSound() {
        console.log("Woof woof!");
    }
}

In this example, the Dog class implements the Animal interface, providing an implementation for the name property and the makeSound method.

3. Can a single class implement multiple interfaces?

Yes, a class can implement multiple interfaces by separating the interface names with commas. For example:

interface Serializable {
    serialize(): string;
}

interface Comparable <T> {
    compare(other: T): number;
}

class MyClass implements Serializable, Comparable<MyClass> {
    serialize() {
        return JSON.stringify(this);
    }

    compare(other: MyClass): number {
        // comparison logic...
        return 0;
    }
}

Here, the MyClass class implements both Serializable and Comparable interfaces.

4. What happens if a class does not implement all the methods and properties of an interface?

If a class does not implement all the required methods and properties of an interface, TypeScript will raise a compile-time error, indicating which members are missing. This ensures that the class correctly adheres to the contract defined by the interface, providing a robust and error-free codebase.

5. Can an interface extend another interface?

Yes, an interface can inherit from one or more other interfaces using the extends keyword, similar to classes. Interfaces can also extend multiple interfaces. For example:

interface Flying {
    fly(): void;
}

interface Swimmer {
    swim(): void;
}

interface Duck extends Flying, Swimmer {}

class Mallard implements Duck {
    fly() {
        console.log("Flying...");
    }

    swim() {
        console.log("Swimming...");
    }
}

The Duck interface extends both Flying and Swimmer, and any class that implements Duck must provide implementations for both fly and swim methods.

6. Can methods in an interface have default implementations?

No, methods in an interface cannot have default implementations. Interfaces in TypeScript are purely abstract and can only contain declarations for properties, methods, and event handlers, without providing any implementation. This differs from abstract classes, which allow both declarations and default implementations.

7. Are properties in an interface always optional?

No, unless explicitly specified as optional using the ? symbol, properties in an interface are considered mandatory. For example:

interface Point {
    x: number;
    y?: number; // optional property
}

Here, x is required, while y is optional. Attempting to create an object that doesn't provide a value for x will result in a compile-time error.

8. How can you implement an interface with methods that have complex behavior involving other methods?

When implementing an interface with dependent methods, you can define the required methods in the class, even if their behavior relies on other methods. Here's an example:

interface Vehicle {
    startEngine(): void;
    stopEngine(): void;
    move(): void;
}

class Car implements Vehicle {
    private engineRunning: boolean = false;

    startEngine() {
        if (!this.engineRunning) {
            console.log("Engine started.");
            this.engineRunning = true;
        }
    }

    stopEngine() {
        if (this.engineRunning) {
            console.log("Engine stopped.");
            this.engineRunning = false;
        }
    }

    move() {
        if (this.engineRunning) {
            console.log("Car is moving.");
        } else {
            console.error("Engine must be started before moving.");
        }
    }
}

In this example, the move method's behavior depends on whether the engine is running, which is managed by startEngine and stopEngine methods.

9. Can interfaces be used with other TypeScript features like generics and enums?

Yes, interfaces can be used with generics and enums in TypeScript. This allows you to create flexible and reusable code patterns. For example:

enum Status {
    Active,
    Inactive
}

interface User<T> {
    id: number;
    name: string;
    status: T;
}

class PremiumUser implements User<Status> {
    id: number;
    name: string;
    status: Status;

    constructor(id: number, name: string, status: Status) {
        this.id = id;
        this.name = name;
        this.status = status;
    }
}

In this example, the User interface is generic and can be parameterized with different types, such as the Status enum, when implementing the PremiumUser class.

10. What is the difference between interfaces and abstract classes in TypeScript?

Interfaces and abstract classes serve similar purposes, but they have some key differences:

  • Interfaces: Cannot contain implementation details. They are purely abstract and can only define method signatures and property declarations without providing any concrete implementations.

  • Abstract Classes: Can contain both abstract (unimplemented) and concrete (implemented) methods. Abstract classes cannot be instantiated directly and are meant to be inherited by other classes.

For example, an interface could represent a contract that classes need to follow, while an abstract class could provide some common functionality that derived classes can build upon.

You May Like This Related .NET Topic

Login to post a comment.