Tyypillisten parametrien käyttö geneeristen rajoitusten TypeScriptissä
TypeScriptissä on myös mahdollisuus määritellä yksi tyypillinen parametri, jota rajoitetaan toisella tyypillisellä parametrilla. Tämä on tarpeen, kun omistuuksia on kopioitava yhdestä objektista toiseen, samalla varmistuen, että emme välitä ylimääräisiä ominaisuuksia.
Tarkastellaan seuraavaa esimerkkiä. Palataan
takaisin funktioon myFunc, joka määrittelee
muuttujan pituuden:
function myFunc <T> (data: T): T {
console.log(data.length); // virhe
return data;
}
Nyt kuitenkin haluamme, että tämä funktio
toimii vain niiden tyyppien kanssa, joilla
on ominaisuus length. Tehdään tätä varten
rajapinta ILength, ja asetetaan sille
ominaisuus length numeeriseen tyyppiin:
interface ILength {
length: number;
}
Seuraavaksi asetamme funktiossamme yleisen
tyypin, joka perii ILength:n
avainsanan extends kautta:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Tältä näyttää täydellinen koodimme:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Testataan funktiomme toimintaa ja etsitään merkkijonon pituus:
console.log(myFunc('abcde'));
Suoritetun koodin tulos:
5
'abcde'
Ja nyt välitetään parametrina taulukko:
console.log(myFunc(['a', 'b', 'c']));
Suoritetun koodin tulos:
3
[ 'a', 'b', 'c' ]