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

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

  1. Базовый универсальный класс:
    Давайте начнем с простого примера универсального класса, который может работать с любым типом. Вот как можно определить универсальный класс:
class Box<T> {
  private value: T;
  constructor(value: T) {
    this.value = value;
  }
  getValue(): T {
    return this.value;
  }
  setValue(newValue: T): void {
    this.value = newValue;
  }
}
// Usage
const numberBox = new Box<number>(42);
console.log(numberBox.getValue()); // Output: 42
const stringBox = new Box<string>('Hello');
console.log(stringBox.getValue()); // Output: Hello
  1. Общие ограничения.
    Вы можете наложить ограничения на параметр типа универсального класса, чтобы ограничить его определенными типами. Например, давайте создадим универсальный класс, который работает только с объектами, имеющими свойство length:
interface Lengthable {
  length: number;
}
class Container<T extends Lengthable> {
  private items: T[];
  constructor(items: T[]) {
    this.items = items;
  }
  getItemCount(): number {
    return this.items.length;
  }
}
// Usage
const stringContainer = new Container<string>(['apple', 'banana', 'cherry']);
console.log(stringContainer.getItemCount()); // Output: 3
const numberContainer = new Container<number>([1, 2, 3, 4, 5]);
console.log(numberContainer.getItemCount()); // Output: 5
// This will result in a compilation error
// const invalidContainer = new Container<boolean>([true, false]);
  1. Статические члены в универсальных классах.
    Универсальные классы в TypeScript также могут иметь статические члены. Вот пример:
class Logger<T> {
  static log(value: T): void {
    console.log(value);
  }
}
// Usage
Logger.log('Hello, world!'); // Output: Hello, world!
Logger.log(42); // Output: 42
  1. Несколько параметров типа:
    В универсальном классе может быть несколько параметров типа. Вот пример общего класса Pair, который содержит два значения разных типов:
class Pair<T, U> {
  private first: T;
  private second: U;
  constructor(first: T, second: U) {
    this.first = first;
    this.second = second;
  }
  getFirst(): T {
    return this.first;
  }
  getSecond(): U {
    return this.second;
  }
}
// Usage
const numberStringPair = new Pair<number, string>(42, 'Hello');
console.log(numberStringPair.getFirst()); // Output: 42
console.log(numberStringPair.getSecond()); // Output: Hello

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

В этой статье с примерами и пояснениями рассматриваются основы универсальных классов TypeScript и демонстрируется их использование в различных сценариях. Его цель – помочь разработчикам понять и использовать возможности дженериков в TypeScript для создания многоразового и типобезопасного кода.