Ограничения на генерализираните типове в TypeScript

В един от предишните уроци създавахме функция с генерализиран тип, която трябваше да извежда дължината на параметъра, подаден в нея. Въпреки това, при компилация получихме грешка, тъй като не всички типове могат да имат дължина:

typescriptfunction myFunc < T > (data: T): T {
  console.log(data.length); // грешка
  return data;
}

В този случай поправихме ситуацията, като променихме генерализирания тип на тип на генерализиран масив. Но в TypeScript има възможност да се създадат ограничения за генерализираните типове. За това в ъгловите скоби, след променливата T пишем ключовата дума extends. След нея в фигурни скоби записваме нова променлива str от тип string. Останалата част от кода на функцията остава без промени:

typescriptfunction myFunc <T extends {str: string}> (data: T): void {
  console.log(data.str.length);
}

Излиза, че генерализираният тип наследява типа на променливата str, указана във фигурните скоби. Сега нека проверим работата на нашата функция и създадем променлива myStr, която сочи към типа str, и зададем й стойност във фигурни скоби:

typescriptlet myStr: {str: string} = {str: 'abcde'};

Нека извикаме функцията myFunc, като не забравяме отново да посочим нейния тип и подадем променливата myStr като параметър:

typescriptmyFunc <{str: string}> (myStr);
Задание 1

На базата на примера, разгледан в урока, задайте функция за намиране на дължината на числов масив.