Използване на типови параметри в ограниченията на дженерици в TypeScript

Също така в TypeScript има възможност за деклариране на един типови параметър, който ще бъде ограничен от друг типови параметър. Това е необходимо, когато трябва да се копират свойства от един обект в друг, като същевременно се предпазим от това, да не предадем излишно свойство.

Нека разгледаме следния пример. Отново се върнем към функцията myFunc, определяща дължината на променлива:

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

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

typescriptinterface ILength {
  length: number;
}

След това в нашата функция задаваме обобщен тип, който наследява от ILength чрез ключовата дума extends:

typescriptfunction myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

Ето как изглежда пълният ни код:

typescriptinterface ILength {
  length: number;
}

function myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

Нека проверим работата на нашата функция и намерим дължината на низ:

typescriptconsole.log(myFunc('abcde'));

Резултат от изпълнения код:

typescript5
'abcde'

А сега да предадем в параметър масив:

typescriptconsole.log(myFunc(['a', 'b', 'c']));

Резултат от изпълнения код:

typescript3
[ 'a', 'b', 'c' ]