Изучение дженериков TypeScript: за пределами массивов

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

Методы работы с универсальными объектами:

  1. Общие функции.
    С помощью дженериков TypeScript вы можете создавать функции, которые работают с универсальными объектами. Вот пример универсальной функции, которая записывает значения объекта:
function logObjectValues<T>(obj: T): void {
  Object.values(obj).forEach((value) => {
    console.log(value);
  });
}
const person = { name: 'John', age: 30 };
logObjectValues(person); // Output: John, 30
  1. Общие интерфейсы.
    Вы можете определить общие интерфейсы для описания объектов с гибкими типами свойств. Вот пример общего интерфейса, представляющего пару ключ-значение:
interface KeyValuePair<K, V> {
  key: K;
  value: V;
}
const pair: KeyValuePair<string, number> = { key: 'count', value: 10 };
console.log(pair.key); // Output: count
console.log(pair.value); // Output: 10
  1. Общие классы.
    Подобно функциям и интерфейсам, в TypeScript можно также создавать общие классы. Вот пример универсального класса, хранящего массив объектов:
class Container<T> {
  private items: T[] = [];
  addItem(item: T): void {
    this.items.push(item);
  }
  getItem(index: number): T {
    return this.items[index];
  }
}
const container = new Container<number>();
container.addItem(1);
container.addItem(2);
console.log(container.getItem(0)); // Output: 1
console.log(container.getItem(1)); // Output: 2
  1. Условные типы.
    TypeScript предоставляет условные типы, которые позволяют нам создавать универсальные типы на основе условий. Вот пример условного типа, который извлекает значения из объекта:
type ExtractValues<T> = T extends { [key: string]: infer V } ? V : never;
const obj = { name: 'Alice', age: 25 };
type ObjectValues = ExtractValues<typeof obj>; // ObjectValues is 'Alice' | 25

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