Article image Understanding Access Modifiers

14. Understanding Access Modifiers

Page 14 | Listen in audio

In TypeScript, access modifiers are an essential feature that allows developers to control the visibility and accessibility of class members. By using access modifiers, you can specify whether certain properties or methods of a class should be publicly accessible, private to the class, or protected within the class hierarchy. This capability provides a robust mechanism for encapsulation, which is a fundamental principle of object-oriented programming (OOP).

Understanding access modifiers is crucial for designing well-structured, maintainable, and secure code. In this section, we will delve into the different types of access modifiers available in TypeScript, how they work, and how you can leverage them to create better software designs.

Public Access Modifier

The public access modifier is the default access level for class members in TypeScript. When a member of a class is declared as public, it means that it can be accessed from anywhere. There is no restriction on its visibility, making it accessible from both inside and outside the class, as well as from any subclasses.

class Animal {
    public name: string;

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

    public move(distance: number): void {
        console.log(`${this.name} moved ${distance} meters.`);
    }
}

const dog = new Animal('Dog');
console.log(dog.name); // Accessible
dog.move(10); // Accessible

In the example above, both the name property and the move method are public, so they can be accessed directly from an instance of the Animal class.

Private Access Modifier

The private access modifier restricts the visibility of a class member to the class itself. A private member cannot be accessed from outside the class, nor can it be accessed by any subclasses. This encapsulation is useful for hiding the internal implementation details of a class and exposing only what is necessary through public methods.

class Animal {
    private name: string;

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

    public move(distance: number): void {
        console.log(`${this.name} moved ${distance} meters.`);
    }
}

const cat = new Animal('Cat');
console.log(cat.name); // Error: Property 'name' is private and only accessible within class 'Animal'.
cat.move(5); // Accessible

Here, the name property is private, so attempting to access it directly from an instance of Animal results in a compilation error. The move method, however, remains accessible because it is public.

Protected Access Modifier

The protected access modifier is similar to private, but with one key difference: members declared as protected can be accessed by subclasses. This makes protected useful for class hierarchies where you want to allow derived classes to access certain members while keeping them hidden from the outside world.

class Animal {
    protected name: string;

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

    protected move(distance: number): void {
        console.log(`${this.name} moved ${distance} meters.`);
    }
}

class Bird extends Animal {
    fly(distance: number): void {
        this.move(distance); // Accessible within subclass
        console.log(`${this.name} flew ${distance} meters.`);
    }
}

const sparrow = new Bird('Sparrow');
sparrow.fly(15); // Accessible
console.log(sparrow.name); // Error: Property 'name' is protected and only accessible within class 'Animal' and its subclasses.

In this example, the name property and move method are protected, allowing the Bird class to access them. However, they remain inaccessible from outside the class hierarchy.

Default Access Modifier

If no access modifier is explicitly specified, TypeScript treats the member as public by default. This means that unless you specifically declare a member as private or protected, it will be publicly accessible.

class Animal {
    name: string; // Public by default

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

const rabbit = new Animal('Rabbit');
console.log(rabbit.name); // Accessible

In this scenario, the name property is public by default, allowing direct access from an instance of the Animal class.

Use Cases and Best Practices

Understanding when and how to use access modifiers is crucial for creating robust and maintainable software. Here are some best practices and use cases:

  • Encapsulation: Use private to hide implementation details and expose only what is necessary through public interfaces. This approach helps in reducing the complexity of your code and makes it easier to change the internal implementation without affecting external code.
  • Inheritance: Use protected when you want to allow subclasses to access certain members while keeping them hidden from other parts of your application. This is particularly useful in scenarios where you have a base class with common functionality that should be shared among derived classes.
  • API Design: When designing APIs or libraries, carefully consider which members should be public, private, or protected. This decision will impact how users interact with your API and how easily they can extend or modify its behavior.
  • Refactoring: Use access modifiers to refactor and improve the structure of your code. By making members private or protected, you can reduce the risk of unintended side effects caused by external code modifying internal state.

Conclusion

Access modifiers in TypeScript provide a powerful mechanism for controlling the visibility and accessibility of class members. By understanding and applying public, private, and protected access modifiers appropriately, you can create well-encapsulated, maintainable, and secure code. These modifiers are fundamental to object-oriented programming and play a crucial role in designing robust software architectures.

As you continue to work with TypeScript, consider how access modifiers can help you achieve better code organization, reduce complexity, and enhance the overall quality of your applications. By leveraging these tools effectively, you'll be well-equipped to tackle complex programming challenges and build scalable, high-quality software solutions.

Now answer the exercise about the content:

What is the default access level for class members in TypeScript if no access modifier is specified?

You are right! Congratulations, now go to the next page

You missed! Try again.

Article image Static Properties and Methods

Next page of the Free Ebook:

15Static Properties and Methods

7 minutes

Earn your Certificate for this Course for Free! by downloading the Cursa app and reading the ebook there. Available on Google Play or App Store!

Get it on Google Play Get it on App Store

+ 6.5 million
students

Free and Valid
Certificate with QR Code

48 thousand free
exercises

4.8/5 rating in
app stores

Free courses in
video, audio and text