TypeScript имеет специальный синтаксис для определения типов параметров и возвращаемых значений функций.
Подробнее о функциях читайте здесь.
Тип возвращаемого значения
Тип возвращаемого значения функции можно явно указать.
Пример
// ": number" здесь указывает, что функция возвращает число
function getTime(): number {
return new Date().getTime();
}
Если тип возвращаемого значения не указан, TypeScript попытается вывести его автоматически на основе типов возвращаемых переменных или выражений.
Тип void (функция не возвращает значение)
Тип void используется для указания, что функция не возвращает никакого значения.
Пример
function printHello(): void {
console.log('Hello!');
}
Параметры функции
Параметры функции определяются аналогично объявлению переменных.
Пример
function multiply(a: number, b: number) {
return a * b;
}
Если тип параметра не указан, TypeScript будет использовать тип any, если нет дополнительной информации о типе, как показано ниже в разделах "Параметры по умолчанию" и "Псевдонимы типов".
Необязательные параметры
По умолчанию TypeScript предполагает, что все параметры обязательны, но их можно явно пометить как необязательные.
Пример
// "?` здесь делает параметр `c` необязательным
function add(a: number, b: number, c?: number) {
return a + b + (c || 0);
}
Параметры по умолчанию
Для параметров с значениями по умолчанию само значение ставится после объявления типа.
Пример
function pow(value: number, exponent: number = 10) {
return value ** exponent;
}
TypeScript также может автоматически вывести тип из значения по умолчанию.
Именованные параметры
Typescript поддерживает именованные параметры функций, которые позволяют группировать аргументы в единый объект с соответствующими свойствами. Такая техника делает код более читаемым и гибким, особенно при большом количестве параметров.
Определение типов именованных параметров происходит аналогично обычному определению параметров.
Пример
// Объявляем функцию с именованными параметрами
function greet({ name, message }: { name: string, message: string }) {
console.log(`${message}, ${name}!`);
}
// Вызов функции с именованными параметрами
greet({
name: "Алексей",
message: "Доброе утро"
}); // Доброе утро, Алексей!
Как это работает:
- Именованные параметры собираются в один объект, который передаётся в функцию.
- Порядок параметров не имеет значения, так как они связаны с именами свойств.
- Можно задать параметры по умолчанию или сделать их необязательными.
Пример с дополнительными возможностями
// Добавляем необязательные параметры
function calculate({ num1, num2, operation = '+' }: { num1: number, num2: number, operation?: '+' | '-' | '*' | '/' }) {
let result: number;
switch(operation) {
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/': result = num1 / num2; break;
default: throw new Error('Неправильная операция');
}
console.log(result);
}
calculate({ num1: 10, num2: 5 }); // 15
calculate({ num1: 10, num2: 5, operation: '-' }); // 5
Используйте именованные параметры, когда функция принимает большое количество аргументов или аргументы имеют важное значение и нуждаются в дополнительной идентификации. Это улучшит читаемость и снизит вероятность ошибок.
Остаточные параметры
Остаточные параметры в TypeScript позволяют передавать в функцию переменное количество аргументов, упакованных в массив. Их можно представить как последний параметр функции, перед которым ставится три точки (...).
Остаточные параметры можно типизировать как обычные параметры, но тип должен быть массивом, так как остаточные параметры всегда являются массивами.
Общий синтаксис
function func(param1: type1, param2: type2, ...restParams: type[]): returnType {
// тело функции
}
Пример
function sum(firstNumber: number, secondNumber: number, ...additionalNumbers: number[]): number {
let totalSum = firstNumber + secondNumber;
for (let i = 0; i < additionalNumbers.length; i++) {
totalSum += additionalNumbers[i];
}
return totalSum;
}
sum(1, 2); // Результат: 3
sum(1, 2, 3, 4, 5); // Результат: 15
Правила и особенности:
- Остаточный параметр должен идти последним в списке аргументов функции.
- Остаточный параметр всегда должен быть массивом.
- Имя остаточного параметра выбирается произвольно, но оно будет представлять массив всех оставшихся аргументов.
Полезные приемы:
- Остаточные параметры удобны, когда заранее неизвестно количество аргументов, которые нужно передать в функцию.
- Тип остаточного параметра можно задать явно, как в примере выше (
number[]), или оставить его неявным.
Пример с типами
function logArguments(firstArg: string, ...args: any[]) {
console.log(firstArg);
args.forEach(arg => console.log(arg));
}
logArguments("Привет", 1, "мир", true); // Выводит: "Привет", 1, "мир", true
Остаточные параметры значительно упрощают работу с функциями, принимающими разное количество аргументов, и способствуют повышению чистоты и гибкости кода.
Псевдоним типа
Псевдонимы типов позволяют определить отдельное имя для сложных или многократно используемых типов данных, включая типы функций. Это улучшает читаемость и организацию кода, особенно при многократном использовании одного и того же типа.
Эти типы записываются аналогично стрелочным функциям.
Пример
// Псевдоним типа функции, принимающей число и возвращающей число
type DoubleFunction = (num: number) => number;
// Теперь можно использовать этот псевдоним в функции
const double: DoubleFunction = (num) => num * 2;
double(5); // Результат: 10
Принцип работы:
- Псевдоним типа
DoubleFunctionописывает функцию, которая принимает один аргумент типаnumberи возвращает значение типаnumber. - Этот псевдоним можно использовать везде, где ожидается функция такого типа.
Особенности псевдонимов типов функций:
- Псевдонимы типов функций позволяют называть сложные сигнатуры функций человеческими именами, повышая читаемость и поддерживаемость кода.
- Псевдонимы типов могут использоваться в сочетании с любыми типами данных, включая примитивные типы, объекты и другие функции.
- Псевдонимы типов функций могут использоваться как в сигнатуре функций, так и в других типах данных, например, в объектах.
Псевдонимы типов функций помогают упростить и упорядочить работу с типами в TypeScript, делая код более чистым и выразительным.