Абмежаванні абагульненняў у 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, указанай у фігурных дужках. Цяпер давайце праверым працу нашай функцыі і створым зменную myStr, якая спасылаецца на тып str, і зададзім ёй значэнне ў фігурных дужках:

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

Давайце выклічам функцыю myFunc, не забываючы зноў указаць яе тып і перададзім зменную myStr як параметр:

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

На аснове прыкладу, разгледжанага ў уроку, задайце функцыю для знаходжання даўжыні лікавага масіва.