ProgrammatieFrontend ontwikkelaar

Hoe werkt het mechanisme van uitbreidbare types (index signatures) in TypeScript? waarvoor wordt het gebruikt, wat zijn de nuances en welke risico's zijn er bij het ontwerpen van dergelijke structuren?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Geschiedenis van de vraag

TypeScript stelt je in staat om objecten met dynamische eigenschapsnamen te beschrijven, wanneer je niet alle sleutels van tevoren kunt bepalen. Hiervoor worden index signatures gebruikt, die ontstaan zijn als een manier om variabele objecten te typen (map, gegevens van een externe server, enz.).

Probleem

Zonder index signature wordt een object alleen herkend op de vooraf bepaalde sleutels; elke andere sleutel zal een compilatiefout veroorzaken. Bovendien kan een onjuiste declaratie van de signature de types van alle eigenschappen van het object vervagen, de type-rigideit verlagen en leiden tot bugs.

Oplossing

Declareer index signature expliciet alleen daar waar het gerechtvaardigd is. Voor het typeren van een array van objecten op een string sleutel, gebruik onderstaande vorm:

Codevoorbeeld:

interface Dictionary { [key: string]: number; length?: number; } const sample: Dictionary = { apples: 4, oranges: 10 }; sample['bananas'] = 6;

Belangrijke kenmerken:

  • Maakt het mogelijk om collecties met willekeurige sleutels te beschrijven
  • Gebaseerd op één enkel type waarde voor alle elementen
  • Vanwege de signature moeten alle extra eigenschappen aan dit type voldoen

Vragen met een val.

Kan ik verschillende waarde types voor verschillende sleutels in index signature opgeven?

Nee, het type geldt voor de gehele set sleutels; als je [key: string]: number opgeeft, moet sample.length ook een number zijn: dit leidt vaak tot fouten bij het samen gebruiken van index signature en bekende eigenschappen.

Kan ik index signature met symbolen (symbol) gebruiken?

Ja, vanaf ES6 ondersteunt TypeScript index signature op symbol:

interface SymbolMap { [key: symbol]: string; }

Wat gebeurt er als ik een object met index signature en extra eigenschappen van een ander type declareer?

De compiler zal een fout geven als het type van de eigenschap niet compatibel is met het opgegeven type van de index signature. Dit kan worden omzeild door gebruik te maken van een union-type of door dergelijke velden in een apart interface te plaatsen.

Typefouten en anti-patronen

  • Overmatig gebruik van index signature in plaats van strikte interfaces
  • Vervaging van types in objecten
  • Onjuiste combinatie van bekende en indexeigenschappen

Voorbeeld uit het leven

Negatieve case

Voor elk antwoord van de server werd de interface {[key: string]: any} gebruikt, wat leidde tot doordringende bugs door een gebrek aan controle over de datastuctuur.

Voordelen:

  • Veelzijdigheid

Nadelen:

  • Volledig verlies van strikte typing binnen het object
  • Verborgen bugs, "verrassingen" in productie

Positieve case

Gebruik index signature strikt voor dictionaries (bijvoorbeeld, configuratie op sleutel), en voor expliciet bekende eigenschappen alleen met declaratie van hun type buiten de signature.

Voordelen:

  • Duidelijke structuur voor collecties/maps
  • Strikte typing voor bekende velden blijft behouden

Nadelen:

  • Meer tijd nodig voor het ontwerpen van de juiste objectarchitectuur