Classes & OOP: Building Robust Architectures
TypeScript provides full support for Object-Oriented Programming (OOP). While JavaScript has classes, TypeScript enhances them with type safety, access modifiers, and advanced patterns like abstract classes and interfaces.
1. Class Structure and Properties
A class in TypeScript is a blueprint for creating objects. You must define the types of the class members (properties and methods).
class BankAccount {
accountNumber: string;
balance: number;
constructor(accountNumber: string, initialBalance: number) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
deposit(amount: number): void {
this.balance += amount;
}
}
2. Access Modifiers: Encapsulation
Access modifiers control which parts of your code can see and modify class members.
public(Default): Accessible from anywhere.private: Only accessible within the class itself.protected: Accessible within the class and its subclasses (inheritance).
class Employee {
public name: string;
private salary: number;
protected department: string;
constructor(name: string, salary: number, dept: string) {
this.name = name;
this.salary = salary;
this.department = dept;
}
}
3. Parameter Properties: The Pro Shortcut
TypeScript provides a shorthand syntax to declare and initialize properties directly in the constructor parameters.
class User {
// This automatically creates 'public username' and 'private id' properties
constructor(public username: string, private id: number) {}
}
const user = new User("alice_dev", 101);
console.log(user.username); // OK
// console.log(user.id); // Error: id is private
4. Getters and Setters
You can use get and set to intercept access to a property. This is useful for validation or logging.
class Circle {
private _radius: number = 0;
get radius(): number {
return this._radius;
}
set radius(value: number) {
if (value < 0) throw new Error("Radius cannot be negative");
this._radius = value;
}
}
5. Inheritance and Polymorphism
Inheritance allows one class to derive from another. Use the extends keyword.
class Shape {
constructor(public color: string) {}
draw() { console.log("Drawing shape..."); }
}
class Square extends Shape {
constructor(color: string, public size: number) {
super(color); // Must call the parent constructor
}
// Overriding a method
override draw() {
console.log(`Drawing a ${this.color} square of size ${this.size}`);
}
}
6. Abstract Classes
An Abstract Class cannot be instantiated directly. It serves as a base class for other classes. It can contain abstract methods which must be implemented by subclasses.
abstract class Logger {
abstract log(message: string): void; // No implementation here
printInfo() {
console.log("System Logger Initialized");
}
}
class FileLogger extends Logger {
log(message: string) {
// Implementation for writing to a file
}
}
7. Summary
- Classes encapsulate data and behavior.
- Access Modifiers implement the OOP principle of Encapsulation.
- Inheritance allows for code reuse and logical hierarchies.
- Abstract Classes define templates for other classes to follow.