Функции в TypeScript
У TypeScript есть собственный синтаксис для указания типов параметров функции и возвращаемого значения.
Эта страница опирается на обычные функции JavaScript, поэтому сначала убедитесь, что вы понимаете, как они работают.
Тип возвращаемого значения
Вы можете указать тип значения, которое возвращает функция, написав его после списка параметров.
Примечание: Если вы не напишете тип возвращаемого значения, TypeScript попытается вывести его — он определит тип по значениям, которые возвращает функция.
Пример
Запись : number после скобок говорит, что getTime возвращает число.
getTime с аннотацией возвращаемого типа number, тело которой возвращает new Date().getTime(), с комментарием, объясняющим аннотацию : number. Пример только объявляет функцию и ничего не выводит.
Вывод: программа на TypeScript и захваченный вывод
// запись `: number` здесь указывает, что эта функция возвращает число
function getTime(): number {
return new Date().getTime();
}
Тип возвращаемого значения void
Используйте тип void, чтобы указать, что функция не возвращает никакого значения.
Пример
void для функции, которая ничего не возвращает.
Напишите функцию printHello с аннотацией возвращаемого типа void, тело которой выводит в журнал «Привет!». Только объявите функцию; не вызывайте её, чтобы ничего не выводилось.
Вывод: программа на TypeScript и захваченный вывод
function printHello(): void {
console.log('Привет!');
}
Параметры
Параметры функции получают типы с помощью того же синтаксиса, что и объявления переменных: двоеточие и тип после имени.
Примечание: Если у параметра нет типа, TypeScript использует тип any — если только он не может найти тип в другом месте, как показано ниже в разделах «Параметры по умолчанию» и «Псевдоним типа».
Пример
multiply с двумя параметрами a и b типа number, которая возвращает их произведение, позволив TypeScript вывести тип возвращаемого значения. Пример только объявляет функцию и ничего не выводит.
Вывод: программа на TypeScript и захваченный вывод
function multiply(a: number, b: number) {
return a * b;
}
Необязательные параметры
По умолчанию TypeScript считает каждый параметр обязательным. Вы можете пометить параметр как необязательный, добавив ? после его имени.
Пример
Знак ? делает c необязательным, поэтому add можно вызывать с двумя или тремя аргументами.
?.
Напишите функцию add с обязательными параметрами a и b типа number и необязательным параметром c типа number, возвращающую a + b + (c || 0), с комментарием, объясняющим ?. Пример только объявляет функцию и ничего не выводит.
Вывод: программа на TypeScript и захваченный вывод
// оператор `?` здесь помечает параметр `c` как необязательный
function add(a: number, b: number, c?: number) {
return a + b + (c || 0);
}
Параметры по умолчанию
Для параметра со значением по умолчанию напишите это значение после аннотации типа.
TypeScript также может вывести тип параметра только по значению по умолчанию.
Пример
exponent имеет тип number и по умолчанию равен 10, если значение не передано.
pow с параметром value типа number и параметром exponent типа number, значение которого по умолчанию равно 10, возвращающую value ** exponent. Пример только объявляет функцию и ничего не выводит.
Вывод: программа на TypeScript и захваченный вывод
function pow(value: number, exponent: number = 10) {
return value ** exponent;
}
Именованные параметры
Именованные параметры — значения, извлечённые из одного объекта-аргумента — типизируются так же, как обычные параметры: тип указывается после шаблона деструктуризации.
Пример
divide, которая деструктурирует dividend и divisor из единственного параметра-объекта с типом { dividend: number, divisor: number } и возвращает dividend / divisor. Пример только объявляет функцию и ничего не выводит.
Вывод: программа на TypeScript и захваченный вывод
function divide({ dividend, divisor }: { dividend: number, divisor: number }) {
return dividend / divisor;
}
Остаточные параметры
Остаточный параметр собирает все дополнительные аргументы. Он типизируется как обычный параметр, но его тип должен быть массивом, потому что остаточный параметр — это всегда массив.
Пример
...rest имеет тип number[], поэтому каждый дополнительный аргумент должен быть числом.
add с параметрами a и b типа number и остаточным параметром ...rest типа number[], возвращающую a + b плюс сумму rest, вычисленную с помощью reduce. Пример только объявляет функцию и ничего не выводит.
Вывод: программа на TypeScript и захваченный вывод
function add(a: number, b: number, ...rest: number[]) {
return a + b + rest.reduce((p, c) => p + c, 0);
}
Псевдоним типа
Тип функции можно записать отдельно от самой функции, используя псевдоним типа.
Такие типы выглядят как стрелочные функции: параметры в скобках, затем => и тип возвращаемого значения.
Пример
Поскольку negateFunction имеет тип Negate, его параметр value автоматически получает тип number.
Negate для функции, принимающей number и возвращающей number, затем присвойте стрелочную функцию (value) => value * -1 константе negateFunction типа Negate, добавив комментарий о том, что value получает свой тип из псевдонима. Пример только объявляет функцию и ничего не выводит.
Вывод: программа на TypeScript и захваченный вывод
type Negate = (value: number) => number;
// в этой функции параметр `value` автоматически получает тип `number` из типа `Negate`
const negateFunction: Negate = (value) => value * -1;