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.
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
Person['salary'] — fout op compileertijd.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"'.
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.