В javascript функции определяются с помощью ключевого слова function, например:
function add(a, b) { return a + b; } // использование функции let result1 = add(1, 2); // результат 3 let result2 = add("1", "2"); // результат 12
TypeScript также определяет функцию с помощью ключевого слова function
, но при этом добавляет дополнительные возможности по работе с функциями. В частности, теперь мы можем определить тип передаваемых параметров и тип
возвращаемого значения.
Функция может иметь параметры, которые указываются после названия функции в скобках через запятую. Через двоеточие после имени параметра указывается его тип:
// определение функции function add(a: number, b: number){ let result = a + b; console.log(result); } // вызов функции add(20, 30); // 50 add(10, 15); //25
Однако поскольку параметры имеют тип number, то при вызове функции
add("1", "2");
компилятор TS выдаст ошибку, так как параметры должны иметь тип number, а не тип string.
При этом функция может не только использовать передаваемые параметры, но и глобальные переменные, определенные во вне:
let koef: number = 1.5; function add(a: number){ let result = a *koef; console.log(result); } add(20); // 30 add(10); //15
Функция может возвращать значение определенного типа, который еще называется типом функции. Возвращаемый тип функции ставится после списка параметров через двоеточие:
function add(a: number, b: number): number { return a + b; } let result = add(1, 2); console.log(result);
В данном случае функция будет возвращать значение типа number
.
Если функция ничего не возвращает, то указывается тип void:
function add(a: number, b: number): void { console.log(a + b); } add(10, 20);
В принципе мы можем и не указывать тип, тогда он будет выводиться неявно на основе возвращаемого значения:
function add(a: number, b: number) { return a + b; } let result = add(10, 20);
В typescript при вызове в функцию должно передаваться ровно столько значений, сколько в ней определено параметров:
function getName(firstName: string, lastName: string) { return firstName + " " + lastName; } let name1 = getName("Иван", "Кузнецов"); let name2 = getName("Иван", "Михайлович", "Кузнецов"); //ошибка, много параметров let name3 = getName("Иван"); //ошибка, мало параметров
Чтобы иметь возможность передавать различное число значений в функцию, в TS некоторые параметры можно объявить как необязательные. Необязательные параметры должны быть помечены вопросительным знаком ?
. Причем необязательные параметры
должны идти после обязательных:
function getName(firstName: string, lastName?: string) { if (lastName) return firstName + " " + lastName; else return firstName; } let name1 = getName("Иван", "Кузнецов"); console.log(name1); // Иван Кузнецов let name2 = getName("Вася"); console.log(name2); // Вася
Во втором случае, когда в функцию передается только имя, второй используемый параметр будет иметь неопределенное значение или "undefined". Поэтому с помощью условной конструкции проверяется наличие значения для этого параметра.
Параметры позволяют задать начальное значение по умолчанию. И если для такого параметра не передается значение, то он использует значение по умолчанию:
function getName(firstName: string, lastName: string="Иванов") { return firstName + " " + lastName; } let name1 = getName("Иван", "Кузнецов"); console.log(name1); // Иван Кузнецов let name2 = getName("Вася"); console.log(name2); // Вася Иванов
Причем в качестве значения можно передавать результат другого выражения:
function defaultLastName(): string{ return "Smith"; } function getName(firstName: string, lastName: string=defaultLastName()) { return firstName + " " + lastName; } let name1 = getName("Tom"); console.log(name1); // Tom Smith