Назад | Учебник TypeScript | Вперёд
TypeScript позволяет создавать как функциональные выражения, так и именованные функции. Работают они, в принципе, аналогично функциям в JavaScript.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Именованная функция function sayHi(name : string) : string { return 'Hello, ' + name; } // функциональное выражение let myvar1 = function(name : string, level : number) : string { return name + ' ' + level; } alert(sayHi('Daemon')); alert(myvar1('myname1', 33)); |
Мы можем объявить переменную, имеющую тип функции с определёнными параметрами и возвращаемым значением:
1 2 3 4 5 6 |
let myHiMonster: (myName : string, myLevel : number) => string = function(name : string, level : number) : string { return 'Hi, ' + name + level; }; alert(myHiMonster('Vasya', 12)); |
В качестве типа переменной мы указываем список формальных параметров, а затем после => указываем возвращаемый тип. После возвращаемого типа после символа = описываем саму функцию.
В примере выше при описании типа переменной myHiMonster мы указывали имена формальных параметров, отличные от имён параметров в самой функции, но это необязательно. Можно было использовать те же самые имена:
1 2 3 4 |
let hiMonster : (name : string, level : number) => string = function(name : string, level : number) : string { return 'Hi, ' + name + level; }; |
Теперь мы можем обращаться к переменным myHiMonster и hiMonster, объявленным выше так, как вызывали бы обычную функцию:
1 2 3 |
alert(myHiMonster('Vasya', 12)); alert(hiMonster('Petya', 10)); |
Вовсе необязательно указывать тип в обоих частях, как мы делали это выше. TypeScript может вывести тип. Достаточно указать его в одной из частей:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
let myHiMonster = function(name : string, level : number) : string { return 'Hi, ' + name + level; }; let hiMonster : (name : string, level : number) => string = function(name, level) { return 'Hi, ' + name + level; }; alert(myHiMonster('Vasya', 12)); alert(hiMonster('Petya', 10)); |
При объявлении функций в TypeScript можно части параметров давать значения по умолчанию:
1 2 3 4 5 6 7 8 9 |
function monsterName(name : string, level = 1) : string { return name + level; } alert(monsterName('Vasya')); // Vasya1 alert(monsterName('Vasya', 10)); // Vasya10 alert(monsterName('Vasya', undefined)); // Vasya1 |
Как указано в последнем примере выше, если параметр со значением по умолчанию последний в списке параметров, то его можно не указывать, либо передать undefined, чтобы он принял значение по умолчанию. Если параметр со значением по умолчанию не последний в списке параметров, то нужно передать undefined, чтобы он принял значение по умолчанию.
Кроме параметров со значением по умолчанию можно ещё созадавать функции с необязательными параметрами. Для этого после имени параметра ставится знак вопроса. Необязательные параметры должны идти после обязательных:
1 2 3 4 5 6 7 8 9 |
function monsterName(name : string, level?: number) : string { return name + (level === undefined ? '' : level); } alert(monsterName('Vasya')); // Vasya alert(monsterName('Vasya', 10)); // Vasya10 alert(monsterName('Vasya', undefined)); // Vasya |
Можно создавать функции с произвольным числом параметров. Для этого последний параметр функции объявляется с типом массива, а перед именем этого последнего параметра ставится троеточие:
1 2 3 4 5 |
function monsterName(name : string, ...someNumbers:number[]) : string { return name + ':' + someNumbers.join(","); } alert(monsterName('Daemon', 1, -12, 0, 45)); //Daemon:1,-12,0,45 |
TypeScript позволяет создавать функции с одинаковым именем, но различным типом и/или количеством аргументов. Это называется перегрузкой функций:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function func1(x1: number) : string; function func1(x1: {field1 : string, field2 : string}) : number; function func1(x1 : string): string; function func1(x1): any { if (typeof x1 == "number") { return "vasya"; } else if (typeof x1 == "string") { return 100; } else if(typeof x1 == "object") { return x1.field1; } } alert(func1("vas")); |
Как мы видим, создание перегруженных функций в TypeScript сильно отличается от создания перегруженных методов в Java. В TypeScript мы сначала объявляем список всех перегрузок, а потом пишем общую реализацию, учитывающую все возможные перегрузки. В Java же мы для каждой перегрузки имели своё тело метода.
Назад | Учебник TypeScript | Вперёд