Изучение универсальных классов в TypeScript: подробное руководство

TypeScript — это статически типизированная расширенная версия JavaScript, которая позволяет разработчикам добавлять аннотации типов в свой код. Одной из мощных возможностей TypeScript является возможность определять универсальные классы, которые могут повысить возможность повторного использования кода и безопасность типов. В этой статье мы рассмотрим универсальные классы TypeScript и предоставим несколько примеров методов, которые можно использовать с ними.

  1. Базовый универсальный класс:
    Давайте начнем с простого примера универсального класса, который представляет структуру данных стека:
class Stack<T> {
  private elements: T[] = [];
  push(item: T) {
    this.elements.push(item);
  }
  pop(): T | undefined {
    return this.elements.pop();
  }
}
// Usage:
const numberStack = new Stack<number>();
numberStack.push(1);
numberStack.push(2);
console.log(numberStack.pop()); // Output: 2
const stringStack = new Stack<string>();
stringStack.push("Hello");
stringStack.push("World");
console.log(stringStack.pop()); // Output: "World"
  1. Общие методы:
    Общие классы также могут иметь обобщённые методы. Вот пример универсального класса с универсальным методом, который меняет местами два элемента:
class Swapper<T> {
  swap(a: T, b: T): void {
    [a, b] = [b, a];
  }
}
// Usage:
const swapper = new Swapper<number>();
let a = 5, b = 10;
swapper.swap(a, b);
console.log(a, b); // Output: 10, 5
  1. Ограничение универсальных типов.
    Вы также можете ограничить параметр универсального типа определенным набором типов с помощью интерфейсов. Вот пример, демонстрирующий универсальный класс, который может принимать только объекты, реализующие интерфейс Comparable:
interface Comparable {
  compareTo(other: this): number;
}
class SortedList<T extends Comparable> {
  private elements: T[] = [];
  add(item: T) {
    this.elements.push(item);
    this.elements.sort((a, b) => a.compareTo(b));
  }
}
// Usage:
class Person implements Comparable {
  constructor(public name: string) {}
  compareTo(other: Person): number {
    return this.name.localeCompare(other.name);
  }
}
const list = new SortedList<Person>();
list.add(new Person("John"));
list.add(new Person("Alice"));

Общие классы в TypeScript предоставляют мощный способ написания многоразового и типобезопасного кода. Используя универсальные типы и методы, вы можете создавать гибкие и эффективные структуры данных, алгоритмы и служебные классы. Используя примеры, приведенные в этой статье, вы можете начать включать универсальные классы в свои проекты TypeScript и воспользоваться преимуществами, которые они предлагают.