TypeScript'теги жалпылоолордун чектөөлөрү

Мурунку сабактардын биринде биз ага берилген параметрдин узундугун чыгарышы керек болгон жалпыланган түрдөгү функция түзгөнбүз. Бирок компиляция убагында бардык түрлөрдүн узундугу боло албагандыктан, бизге ката чыкты:

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

Ошол учурда биз жалпыланган түрдү жалпыланган массив түрүнө өзгөртүп, абалды оңдодук. Бирок TypeScript'те жалпылоолорду чектөө мүмкүнчүлүгү бар. Бул үчүн бурчтук кашаада, T өзгөрмөсүнөн кийин extends ачкыч сөзүн жазабыз. Андан кийин кымыра кашаада жаңы str сап түрүндөгү өзгөрмөнү жазабыз. Функциянын калган коду өзгөрүүсүз калат:

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

Демек, жалпыланган түр кымыра кашаада көрсөтүлгөн str өзгөрмөсүнүн түрүн мурастайт. Эми келиңиз, биздин функциябыздын иштерин текшерип, str түрүнө шилтеме кылган myStr өзгөрмөсүн түзүп, ага кымыра кашаада маани берели:

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

Келиңиз, myFunc функциясын чакыралы, анын түрүн кайрадан көрсөтүүнү унутпай, жана myStr өзгөрмөсүн параметр катары берели:

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

Сабакта каралган мисалдын негизинде, сандык массивдин узундугун табуу үчүн функцияны белгилеңиз.