TypeScript: Освоение Перегрузки и Дженериков

Источник: «TypeScript: Mastering Overloading and Generics»
TypeScript, статически типизированный надмножество JavaScript, привносит в язык дополнительные статические типы и объектно-ориентированное программирование на основе классов. Две важнейшие концепции, которые вводит TypeScript, — это Перегрузка и Дженерики. Эти возможности повышают гибкость, удобство повторного использования кода и безопасность наших программ.

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

Перегрузка функций

Перегрузка функций в TypeScript — это возможность создания нескольких методов с одним и тем же именем, но разными типами или количеством параметров. Компилятор использует количество, типы и порядок аргументов для определения того, какой метод следует вызвать.

Рассмотрим пример:

export function myFunction(input: string): string;
export function myFunction(input: number): number;
/**
* Overloads
* @param input
* @returns number|string
*/

export function myFunction(input: unknown): unknown {
return input;
}

В приведённом выше примере мы перегрузили myFunction двумя сигнатурами. Одна из них принимает аргумент типа string и возвращает string, а другая принимает тип number и возвращает number.

Реальная реализация myFunction принимает на входе тип unknown и возвращает unknown. Эта реализация перегрузки должна быть совместима с типами, объявленными во всех перегрузках. В качестве типа мы используем unknown, поскольку он может охватывать как строковые, так и числовые типы, что делает его совместимым с сигнатурами перегрузок.

Посмотрите, как вызывается функция myFunction с различными типами аргументов:

const overloadNumberRes = myFunction(12);
const overloadStringRes = myFunction("");
const overloadUnknownRes = myFunction([]);

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

Дженерики в функциях/Обобщённые функции

Дженерики — ещё одна мощная возможность TypeScript, позволяющая создавать многократно используемые компоненты, работающие с любыми типами.

Рассмотрим пример:

/**
* Generics
* @param input
* @returns T
*/

export function myGenericFunction<T>(input: T): T {
return input;
}

В приведённом выше примере myGenericFunction является обобщённой (дженерик) функцией и объявляется с помощью заполнителя (T). Эта функция может работать с любым типом T. Самое интересное в этом то, что тип T определяется при вызове функции, а не задаётся. Функция принимает аргумент типа T, а также возвращает аргумент типа T.

Вот как мы вызываем myGenericFunction с явно указанными типами дженериков:

const genericStringRes = myGenericFunction<string>("");
const genericNumberRes = myGenericFunction<number>(5);
const genericArrayRes = myGenericFunction<Array<unknown>>([]);
const genericObjectRes = myGenericFunction<object>({});

При вызове myGenericFunction TypeScript обеспечивает соответствие типов передаваемых и возвращаемых аргументов в зависимости от типа, указанного в угловых скобках, что повышает безопасность типов в нашей программе.

Заключение

Передовые возможности TypeScript, такие, как Перегрузка и Дженерики, расширяют возможности JavaScript, обеспечивая сильную статическую типизацию и дополнительные возможности ООП. С помощью TypeScript мы получаем всю гибкость JavaScript вместе с проверками на этапе компиляции, что делает наши приложения надёжными, удобными в обслуживании и менее подверженными ошибкам во время выполнения. Поэтому в следующий раз, когда вы будете работать над проектом на TypeScript, попробуйте использовать Перегрузку и Дженерики; возможно, это сделает вашу работу намного более гладкой!

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 6.4: Улучшения AssetMapper

Следующая Статья

Как использовать Node.js с Docker