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:

typescriptfunction 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:

typescriptinterface ILength {
  length: number;
}

Seuraavaksi asetamme funktiossamme yleisen tyypin, joka perii ILength:n avainsanan extends kautta:

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

Tältä näyttää täydellinen koodimme:

typescriptinterface 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:

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

Suoritetun koodin tulos:

typescript5
'abcde'

Ja nyt välitetään parametrina taulukko:

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

Suoritetun koodin tulos:

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