TypeScript полностью поддерживает объектно-ориентированное программирование и включает в себя множество элементов ООП. Некоторые из основных элементов ООП, поддерживаемых в TypeScript, включают в себя:
- Классы - классы в TypeScript используются для создания объектов, которые могут содержать свойства (переменные) и методы (функции). Классы в TypeScript могут быть абстрактными, наследуемыми, иметь интерфейсы и т.д.
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
eat(food: string) {
console.log(`${this.name} is eating ${food}.`);
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed;
}
bark() {
console.log('Woof! Woof!');
}
}
const dog = new Dog('Buddy', 'Golden Retriever');
dog.eat('meat'); // Output: 'Buddy is eating meat.'
dog.bark(); // Output: 'Woof! Woof!'В этом примере Animal - это базовый класс, который содержит свойство name и метод eat(). Класс Dog наследует класс Animal и добавляет свойство breed и метод bark().
- Интерфейсы - интерфейсы в TypeScript используются для определения формата объектов, которые могут содержать свойства (переменные), методы (функции) и индексаторы. Интерфейсы не имеют реализации и используются для проверки совместимости типов.
interface Person {
name: string;
age: number;
sayHello(): void;
}
class Student implements Person {
name: string;
age: number;
studentId: string;
constructor(name: string, age: number, studentId: string) {
this.name = name;
this.age = age;
this.studentId = studentId;
}
sayHello() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
const student: Person = new Student('John', 20, '123456');
student.sayHello(); // Output: 'Hello, my name is John and I am 20 years old.'В этом примере Person - это интерфейс, который определяет свойства name, age и метод sayHello(). Класс Student реализует интерфейс Person и содержит свойства name, age и studentId, а также реализацию метода sayHello().
- Абстрактные классы - абстрактные классы в TypeScript используются для определения общей структуры и поведения для нескольких классов. Абстрактные классы не могут быть созданы напрямую, они могут только быть унаследованы другими классами.
abstract class Animal {
abstract makeSound(): void;
move(distanceInMeters: number = 0) {
console.log(`Animal moved ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
makeSound() {
console.log('Woof! Woof!');
}
}
const dog = new Dog();
dog.makeSound(); // Output: 'Woof! Woof!'
dog.move(10); // Output: 'Animal moved 10m.'В этом примере Animal - это абстрактный класс, который содержит абстрактный метод makeSound() и обычный метод move(). Класс Dog наследует Animal и реализует метод makeSound().
- Наследование - наследование в TypeScript используется для создания новых классов на основе существующих. Наследование позволяет создавать более специфичные классы, которые наследуют свойства и методы от более общих классов.
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
eat(food: string) {
console.log(`${this.name} is eating ${food}.`);
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed;
}
bark() {
console.log('Woof! Woof!');
}
}
const dog = new Dog('Buddy', 'Golden Retriever');
dog.eat('meat'); // Output: 'Buddy is eating meat.'
dog.bark(); // Output: 'Woof! Woof!'- Модификаторы доступа - модификаторы доступа в TypeScript используются для ограничения доступа к свойствам и методам классов. TypeScript поддерживает три типа модификаторов доступа:
public,privateиprotected. Модификаторpublicозначает, что свойство или метод доступен из любого места в коде. Модификаторprivateозначает, что свойство или метод доступен только внутри класса. Модификаторprotectedозначает, что свойство или метод доступен внутри класса и его наследников.
class Animal {
public name: string;
private age: number;
protected breed: string;
constructor(name: string, age: number, breed: string) {
this.name = name;
this.age = age;
this.breed = breed;
}
public eat(food: string) {
console.log(`${this.name} is eating ${food}.`);
}
private sleep() {
console.log(`${this.name} is sleeping.`);
}
protected walk(distanceInMeters: number) {
console.log(`${this.name} walked ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
constructor(name: string, age: number, breed: string) {
super(name, age, breed);
}
public play(fetch: boolean) {
console.log(`${this.name} is playing${fetch ? ' fetch' : ''}.`);
this.walk(10);
}
}
const dog = new Dog('Buddy', 2, 'Golden Retriever');
dog.eat('meat'); // Output: 'Buddy is eating meat.'
dog.play(true); // Output: 'Buddy is playing fetch.' 'Buddy walked 10m.'- Полиморфизм - полиморфизм в TypeScript используется для создания объектов, которые могут иметь различное поведение в зависимости от контекста. TypeScript поддерживает два типа полиморфизма: переопределение методов и обобщенные типы.
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound() {
console.log('Animal is making a sound.');
}
}
class Cat extends Animal {
makeSound() {
console.log('Meow!');
}
}
class Cow extends Animal {
makeSound() {
console.log('Moo!');
}
}
const animals: Animal[] = [new Cat('Fluffy'), new Cow('Betsy')];
animals.forEach((animal) => animal.makeSound()); // Output: 'Meow!' 'Moo!'В этом примере Animal - это базовый класс, который содержит метод makeSound(). Классы Cat и Cow наследуют Animal и переопределяют метод makeSound(). Массив animals содержит объекты Cat и Cow, которые могут быть использованы в цикле для вызова метода makeSound().
- Обобщенные типы - обобщенные типы в TypeScript используются для создания функций и классов, которые могут работать с различными типами данных. Обобщенные типы позволяют создавать более гибкий и переиспользуемый код.
function ...reverse<T>(items: T[]): T[] {
return items.reverse();
}
const numbers = [1, 2, 3, 4, 5];
const reversedNumbers = reverse(numbers);
console.log(reversedNumbers); // Output: [5, 4, 3, 2, 1]
const strings = ['one', 'two', 'three', 'four', 'five'];
const reversedStrings = reverse(strings);
console.log(reversedStrings); // Output: ['five', 'four', 'three', 'two', 'one']В этом примере функция reverse() принимает массив любого типа данных T и возвращает массив того же типа данных T. Функция может быть использована для переворачивания массивов чисел и строк. Обобщенные типы в TypeScript позволяют создавать более универсальный код, который может работать с различными типами данных.