ProgrammatieFullstack ontwikkelaar

Hoe werken Indexed Access Types (indextoegangstypen, zoals T[K])? Wanneer moeten ze worden toegepast, hoe fouten bij het wijzigen van de typestructuur te vermijden, en wat is hun rol in complexe objecten?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Indexed Access Types (of indextoegangstypen) maken het mogelijk om naar het type van een specifiek eigenschap van een object of een sleutel te verwijzen met de syntaxis T[K]. Dit is een krachtig hulpmiddel voor het creëren van flexibele en type-veilige abstracties.

Voorbeeld:
type Person = { name: string; age: number; }; type NameType = Person['name']; // string type AgeOrName = Person['age' | 'name']; // number | string

Het wordt gebruikt voor het schrijven van generieke types en functies:

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; // correcte typebepaling van de return } const user = { email: 'a@a.ru', id: 1 }; let id = getProperty(user, 'id'); // id: number

Waarvoor:

  • Voor het creëren van constructortypes (bijvoorbeeld het extraheren van het type waarde op sleutel uit complexe geneste structuren).
  • Het opbouwen van bijbehorende types (Record, Pick, enz.)

Nuances:

  • Bij wijziging van het oorspronkelijke type (Person) verandert ook het resultaat van indextoegang, wat plotseling invloed kan hebben op bindingen op alle plaatsen!
  • TS vangt de situatie niet op als de sleutel niet bestaat: Person['salary'] — fout op compileertijd.

Bedrogende vraag

Vraag: Wat voor type krijg je van de expressie type Foo = {a: number, b: string}["a" | "b" | "c"]?

Antwoord: Dit voorbeeld zal een compileerfout veroorzaken omdat 'c' geen sleutel is in het type waar toegang toe wordt verkregen. TypeScript zal de fout geven:

Type '"c"' does not satisfy the constraint '"a" | "b"'.

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp.


Verhaal

In het project werden formulieren dynamisch gegenereerd op basis van types. Na het toevoegen van een nieuw veld aan het hoofdtype werden de plaatsen met indexering op sleutels niet bijgewerkt, waardoor sommige eigenschappen niet in het formulier terechtkwamen, terwijl op type-niveau een volledige mapping werd verwacht. De fout manifesteerde zich alleen op runtime, en niet in de ontwikkelingsfase.


Verhaal

In een bibliotheek voor datavalidatie werd indexeerbare toegang via types gebruikt, maar bij de migratie van de code werd een van de sleutels van het object naar de ouder verplaatst. Het oude indexeerbare type leidde tot een compileerfout, maar de fout verscheen pas na een herbouw vanwege de cache in CI, en ervoor leefde het enkele weken op staging.


Verhaal

Men dacht ten onrechte dat met behulp van Indexed Access Types naar elke sleutel kan worden verwezen, zelfs als deze niet expliciet is opgesomd, wat leidde tot onjuiste generatie van geautomatiseerde tests voor dynamische eigenschappen. Als gevolg hiervan dekte de tests een deel van de mogelijke scenario's niet, omdat de compiler deze gevallen als ongeldig afwees.