Използване на типови параметри в ограниченията на дженерици в TypeScript
Също така в TypeScript има възможност за деклариране на един типови параметър, който ще бъде ограничен от друг типови параметър. Това е необходимо, когато трябва да се копират свойства от един обект в друг, като същевременно се предпазим от това, да не предадем излишно свойство.
Нека разгледаме следния пример. Отново
се върнем към функцията myFunc, определяща
дължината на променлива:
function myFunc <T> (data: T): T {
console.log(data.length); // грешка
return data;
}
Въпреки това сега искаме тази функция
да работи само с тези типове, при които
има свойство length. За това ще направим
интерфейс ILength, на който зададем
свойство length от числов тип:
interface ILength {
length: number;
}
След това в нашата функция задаваме обобщен
тип, който наследява от ILength
чрез ключовата дума extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Ето как изглежда пълният ни код:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Нека проверим работата на нашата функция и намерим дължината на низ:
console.log(myFunc('abcde'));
Резултат от изпълнения код:
5
'abcde'
А сега да предадем в параметър масив:
console.log(myFunc(['a', 'b', 'c']));
Резултат от изпълнения код:
3
[ 'a', 'b', 'c' ]