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, попробуйте использовать Перегрузку и Дженерики; возможно, это сделает вашу работу намного более гладкой!