Что преподносит TypeScript со стороны ООП

Ответ

TypeScript поддерживает ключевые концепции ООП: классы, интерфейсы, наследование, инкапсуляцию и полиморфизм.

Классы с модификаторами доступа (public, private, protected):

class Animal {
  private name: string;  
  constructor(name: string) { this.name = name; }  
  protected speak(): void { console.log(`${this.name} makes a sound`); }  
}  

Наследование:

class Dog extends Animal {  
  bark(): void { this.speak(); } // доступ к protected методу  
}  

Интерфейсы для описания контрактов:

interface Movable {  
  move(): void;  
}  
class Car implements Movable {  
  move() { console.log("Driving..."); }  
}  

Абстрактные классы и перегрузка методов также поддерживаются. TypeScript добавляет статическую типизацию, что делает ООП-код более предсказуемым.

Ответ 18+ 🔞

А, ну это ж классика, блядь! ООП в TypeScript — это как Герасим с Муму, только без утопления в конце, слава богу. Слушай сюда, разжуем.

Ну типа, представь, ты строишь дом. Класс — это чертёж, ёпта, схема, по которой ты будешь штамповать квартиры-объекты. И чтобы соседи не лазили к тебе в холодильник, есть модификаторы доступа — private, public, protected. private — это твой личный дневник, нахуй никому не покажешь. protected — как семейный рецепт, только своим наследникам. public — ну это как подъезд, все туда срут.

Вот, смотри, как это выглядит, блядь:

class Animal {
  private name: string; // Секретная кличка, никому не скажем
  constructor(name: string) { this.name = name; }
  protected speak(): void { console.log(`${this.name} makes a sound`); } // Только детям можно
}

А теперь наследование — это когда твой сынок-программист получает от тебя в наследство кривые руки и долги, но также и доступ к protected методам! Красота, да?

class Dog extends Animal {
  bark(): void {
    this.speak(); // Папин секретный метод — теперь и мой!
    console.log("Гав-гав, сука!");
  }
}

Дальше — интерфейсы. Это как договор в бане, ёбта. Подписался — будь добр, выполняй. Говоришь, что умеешь двигаться (Movable) — так двигайся, нахуй, не ссы!

interface Movable {
  move(): void;
}

class Car implements Movable {
  move() {
    console.log("Еду, блядь, не мешай!");
    // А если не реализуешь move() — компилятор тебя ебнет, как Герасим Муму
  }
}

Ну и верх пирога — абстрактные классы и перегрузка методов. Абстрактный класс — это как дедушка, который только учит жизни, но сам нихуя не делает. Нельзя создать его экземпляр, только наследоваться. А перегрузка — это когда ты один метод называешь по-разному, в зависимости от того, что в него суёшь. Гибкость, блядь, овердохуищная!

TypeScript поверх этого всего ещё и статическую типизацию натягивает, как презерватив на банан. Код становится предсказуемым, как итог встречи с тёщей — знаешь, что будет пиздец, но хотя бы готов к нему.

Вот и вся философия, если в двух словах. Создаёшь чёткие схемы (классы), наводишь порядок в доступе (инкапсуляция), плодишь наследников (наследование), заставляешь всех играть по правилам (интерфейсы) и используешь одно и то же по-разному (полиморфизм). А TypeScript следит, чтобы ты не обосрался на этапе написания кода, а не когда всё уже ебнулось в продакшене. Гениально и просто, как "Муму", только со счастливым концом.