TypeScript, расширенная версия JavaScript, предоставляет мощные функции, упрощающие процесс разработки. Одной из таких функций являются дженерики, которые позволяют нам писать многоразовый и типобезопасный код. В этой записи блога мы рассмотрим дженерики TypeScript в контексте функций и изучим различные методы, позволяющие полностью раскрыть их потенциал.
- Базовая универсальная функция.
Давайте начнем с простого примера универсальной функции, которая принимает аргумент типаTи возвращает то же значение.
function identity<T>(arg: T): T {
return arg;
}
Здесь Tпредставляет параметр типа, который можно заменить на любой тип при вызове функции. Механизм вывода типа автоматически определит тип на основе переданного аргумента.
- Преобразование массива.
Обобщенные элементы можно использовать для создания функций, работающих с различными типами массивов. Например, мы можем написать функцию, преобразующую массив одного типа в массив другого типа.
function mapArray<T, U>(array: T[], mapper: (item: T) => U): U[] {
return array.map(mapper);
}
Функция mapArrayпринимает массив типа Tи функцию преобразования, которая преобразует каждый элемент в тип U. Результирующий массив будет содержать элементы типа U.
- Ограничения типов.
Иногда нам необходимо ограничить типы, которые можно использовать с универсальными шаблонами. Этого можно добиться, применив ограничения типа с помощью ключевого словаextends.
interface Lengthwise {
length: number;
}
function printLength<T extends Lengthwise>(obj: T): void {
console.log(obj.length);
}
В этом примере функция printLengthпринимает объект типа T, который должен иметь свойство length. Это ограничение гарантирует, что мы можем безопасно получить доступ к свойству lengthвнутри функции.
- Параметры типа по умолчанию:
TypeScript позволяет нам указывать типы по умолчанию для общих параметров. Эта функция пригодится, когда мы хотим обеспечить поведение по умолчанию, которое при необходимости можно переопределить.
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
Функция getPropertyизвлекает свойство объекта на основе предоставленного ключа. Второй параметр типа Kможет быть одним из ключей T. Это гарантирует, что мы сможем получить доступ только к действительным свойствам объекта.
В этой статье мы рассмотрели возможности дженериков TypeScript в контексте функций. Мы научились создавать универсальные функции, преобразовывать массивы, применять ограничения типов и использовать параметры типа по умолчанию. Обобщенные шаблоны позволяют нам писать гибкий и многократно используемый код, сохраняя при этом строгую типизацию и безопасность типов.
Освоив дженерики TypeScript в своих функциях, вы сможете повысить свои навыки разработки и создавать более надежные и удобные в обслуживании приложения.