В 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