Освоение дженериков TypeScript в ваших функциях: подробное руководство

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

  1. Базовая универсальная функция.
    Давайте начнем с простого примера универсальной функции, которая принимает аргумент типа Tи возвращает то же значение.
function identity<T>(arg: T): T {
  return arg;
}

Здесь Tпредставляет параметр типа, который можно заменить на любой тип при вызове функции. Механизм вывода типа автоматически определит тип на основе переданного аргумента.

  1. Преобразование массива.
    Обобщенные элементы можно использовать для создания функций, работающих с различными типами массивов. Например, мы можем написать функцию, преобразующую массив одного типа в массив другого типа.
function mapArray<T, U>(array: T[], mapper: (item: T) => U): U[] {
  return array.map(mapper);
}

Функция mapArrayпринимает массив типа Tи функцию преобразования, которая преобразует каждый элемент в тип U. Результирующий массив будет содержать элементы типа U.

  1. Ограничения типов.
    Иногда нам необходимо ограничить типы, которые можно использовать с универсальными шаблонами. Этого можно добиться, применив ограничения типа с помощью ключевого слова extends.
interface Lengthwise {
  length: number;
}
function printLength<T extends Lengthwise>(obj: T): void {
  console.log(obj.length);
}

В этом примере функция printLengthпринимает объект типа T, который должен иметь свойство length. Это ограничение гарантирует, что мы можем безопасно получить доступ к свойству lengthвнутри функции.

  1. Параметры типа по умолчанию:
    TypeScript позволяет нам указывать типы по умолчанию для общих параметров. Эта функция пригодится, когда мы хотим обеспечить поведение по умолчанию, которое при необходимости можно переопределить.
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

Функция getPropertyизвлекает свойство объекта на основе предоставленного ключа. Второй параметр типа Kможет быть одним из ключей T. Это гарантирует, что мы сможем получить доступ только к действительным свойствам объекта.

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

Освоив дженерики TypeScript в своих функциях, вы сможете повысить свои навыки разработки и создавать более надежные и удобные в обслуживании приложения.