Použití typových parametrů v omezeních generik v TypeScriptu
TypeScript také umožňuje deklaraci jednoho typového parametru, který bude omezen jiným typovým parametrem. To je nezbytné, když je potřeba kopírovat vlastnosti z jednoho objektu do druhého a zároveň se pojistit proti tomu, že nepředáme nadbytečnou vlastnost.
Podívejme se na následující příklad. Znovu
přejděme k funkci myFunc, která určuje
délku proměnné:
function myFunc <T> (data: T): T {
console.log(data.length); // chyba
return data;
}
Nyní však chceme, aby tato funkce
pracovala pouze s těmi typy, které
mají vlastnost length. K tomu vytvoříme
rozhraní ILength, kterému nastavíme
vlastnost length číselného typu:
interface ILength {
length: number;
}
Dále v naší funkci nastavme generický
typ, který dědí od ILength
pomocí klíčového slova extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Takhle vypadá náš úplný kód:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Pojďme otestovat funkčnost naší funkce a najděme délku řetězce:
console.log(myFunc('abcde'));
Výsledek provedeného kódu:
5
'abcde'
A nyní předáme do parametru pole:
console.log(myFunc(['a', 'b', 'c']));
Výsledek provedeného kódu:
3
[ 'a', 'b', 'c' ]