TypeScript — работа с функциями
В TypeScript можно использовать различные подходы и паттерны при работе с функциями, включая строгую типизацию, перегрузку функций, стрелочные функции, необязательные и остаточные параметры.
Рассмотрим эти концепции более подробно с примерами.
Строгая типизация параметров и возвращаемого значения
TypeScript позволяет указывать типы для параметров функций и возвращаемого значения.
// Функция для сложения двух чисел с явным указанием типов
function add(a: number, b: number): number {
return a + b;
}
const result = add(5, 10); // корректно
Необязательные параметры
Вы можете указать, что некоторые параметры функции не обязательны.
// Функция с необязательным параметром
function greet(name: string, greeting?: string): string {
return `${greeting || 'Hello'}, ${name}`;
}
console.log(greet('Alice')); // Выводит "Hello, Alice"
Остаточные параметры (Rest Parameters)
Также поддерживаются остаточные параметры, позволяя функции принимать неопределенное количество аргументов.
// Функция, принимающая несколько числовых аргументов и возвращающая их сумму
function sumAll(...numbers: number[]): number {
return numbers.reduce((acc, num) => acc + num, 0);
}
console.log(sumAll(1, 2, 3, 4)); // Выводит 10
Перегрузка функций
Перегрузка функций, позволяет определить несколько сигнатур для одной функции.
// Перегрузка функции
function getInfo(name: string): string;
function getInfo(age: number): string;
function getInfo(value: string | number): string {
if (typeof value === "string") {
return `Name: ${value}`;
} else {
return `Age: ${value}`;
}
}
console.log(getInfo('Alice')); // Выводит "Name: Alice"
console.log(getInfo(42)); // Выводит "Age: 42"
Сначала мы определяем две перегрузки функции getInfo. Первая принимает строку (имя), а вторая — число (возраст).
После перегрузок идёт реализация функции. Она принимает параметр, который может быть либо строкой, либо числом. Внутри функции мы проверяем тип значения с помощью typeof и возвращаем соответствующую строку.
При вызове getInfo с разными типами аргументов TypeScript автоматически использует соответствующую перегрузку. Это дает нам гибкость в том, как мы можем использовать функцию, сохраняя при этом строгую типизацию и предсказуемость поведения.
Почему стоит использовать перегрузки?
Перегрузки функций могут быть полезны в более сложных сценариях, особенно когда функция должна вести себя совершенно по-разному в зависимости от типа и/или количества передаваемых параметров.
Несколько примеров, где перегрузки могут быть полезны:
- Различное количество параметров: Если функция должна принимать разное количество параметров в зависимости от ситуации.
- Сильно различающаяся логика: Когда логика обработки для разных типов данных сильно отличается, перегрузки помогают поддерживать чистоту кода и его понимание.
- Читаемость и поддержка: Перегрузки могут улучшить читаемость кода, делая намерения программиста более ясными и предоставляя более строгую проверку типов во время компиляции.
Утверждения типов для функций
Иногда вам может потребоваться утвердить тип возвращаемого значения, особенно когда TypeScript не может правильно вывести его.
// Утверждение типа возвращаемого значения
function getArray<T>(items: T[]): T[] {
return new Array().concat(items);
}
let numberArray = getArray<number>([1, 2, 3]); // Явно указываем, что ожидаем массив чисел