Indexsignatures versus Record
Kies tussen indexsignatures en het utility type Record
Indexsignatures versus Record is een gratis TypeScript Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject TypeScript Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus TypeScript Academy bevat in totaal 4 lessen.
Een woordenboek op twee manieren typeren
TypeScript biedt twee gebruikelijke manieren om een woordenboek te beschrijven: een indexsignatuur zoals { [k: string]: V } en het ingebouwde hulptype Record<K, V>. Ze overlappen grotendeels, maar lezen verschillend.
Het hulptype Record
Record<K, V> construeert een objecttype waarvan de sleutels K zijn en de waarden V. Met string als sleuteltype is het gelijkwaardig aan een tekenreeksindexsignatuur.
type Scores = Record<string, number>
const game: Scores = { alice: 10, bob: 7 }
console.log(game.alice)Gelijkwaardig aan een indexsignatuur
Deze twee typen beschrijven dezelfde structuur. Record<string, number> en { [key: string]: number } zijn uitwisselbaar voor willekeurige tekenreekssleutels.
type A = Record<string, number>
type B = { [key: string]: number }
const a: A = { x: 1 }
const b: B = a // assignable both ways
console.log(b.x)Record met een unie van letterlijke sleutels
De echte kracht van Record wordt zichtbaar bij een eindige unie van letterlijke sleutels. Het resultaat is een object waarin elke vermelde sleutel verplicht is — iets wat een indexsignatuur niet kan uitdrukken.
type Role = "admin" | "editor" | "viewer"
type Perms = Record<Role, boolean>
const p: Perms = { admin: true, editor: true, viewer: false }
console.log(p.admin)Ontbrekende sleutels worden gevonden
Omdat elke letterlijke sleutel verplicht is, leidt het vergeten van één sleutel tot een compilatiefout. Dat is een sterke garantie die indexsignaturen eenvoudigweg niet kunnen bieden.
type Role = "admin" | "editor" | "viewer"
// const bad: Record<Role, boolean> = { admin: true, editor: true }
// Error: property viewer is missingEen indexsignatuur staat elke sleutel toe
Een indexsignatuur daarentegen is onbeperkt. Je kunt sleutels toevoegen die nergens eerder zijn genoemd, en niets hoeft aanwezig te zijn.
type Open = { [key: string]: number }
const o: Open = {} // no keys required
o.anything = 1 // any key allowed
console.log(o.anything)Eindige sleutelverzamelingen: kies Record
Wanneer de sleutels een bekende, eindige verzameling vormen, is Record met een unie van letterlijke sleutels duidelijker en veiliger. Het documenteert precies welke sleutels bestaan en controleert of de verzameling compleet is.
type Direction = "north" | "south" | "east" | "west"
type Moves = Record<Direction, number>
const m: Moves = { north: 1, south: 0, east: 2, west: 0 }
console.log(m.east)Onbeperkte sleutelverzamelingen: beide werken
Wanneer sleutels onbeperkt zijn en tijdens de uitvoering worden ontdekt, werken zowel Record<string, V> als een indexsignatuur. Veel teams kiezen voor Record vanwege de beknoptheid, andere kiezen de signatuur vanwege de explicietheid.
type Cache1 = Record<string, string>
type Cache2 = { [url: string]: string }
const c: Cache1 = {}
c["/home"] = "<html>"
console.log(c["/home"])Record is slechts een gemapt type
Intern is Record<K, V> gedefinieerd als een gemapt type: { [P in K]: V }. Dit verklaart waarom een unie van letterlijke sleutels verplichte sleutels oplevert, terwijl string een indexsignatuur oplevert.
// lib definition (simplified):
// type Record<K extends string | number | symbol, V> = { [P in K]: V }
type Flags = Record<"a" | "b", boolean>
const f: Flags = { a: true, b: false }
console.log(f.a)Benoemde sleutels plus vangnet
Een indexsignatuur kan in één interface een vangnet combineren met vaste sleutels — handig wanneer je beide nodig hebt. Alleen Record kan verplichte benoemde sleutels en een open vangnet niet zo netjes combineren.
interface Response {
status: number
[header: string]: number | string
}
const r: Response = { status: 200, "x-id": "abc" }
console.log(r.status)In de praktijk kiezen
Vuistregel: eindige, bekende sleutels → Record<Union, V> voor controle op volledigheid. Onbeperkte sleutels → beide vormen zijn geschikt. Benoemde sleutels plus een vangnet nodig → gebruik een indexsignatuur in een interface.
type Status = "ok" | "error"
type Messages = Record<Status, string>
const msg: Messages = { ok: "done", error: "failed" }
console.log(msg.ok)Korte controle
Toets je begrip van Record en indexsignaturen.
Samenvatting
Record<string, V> is gelijk aan een tekenreeksindexsignatuur, maar Record met een unie van letterlijke sleutels maakt elke vermelde sleutel verplicht en vindt ontbrekende sleutels tijdens het compileren. Gebruik Record<Union, V> voor eindige, bekende sleutels, beide vormen voor onbeperkte sleutels en een indexsignatuur wanneer je benoemde sleutels plus een vangnet nodig hebt. Intern is Record het gemapte type { [P in K]: V }.
Leer TypeScript met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 101
- Lessen
- 352
Veelgestelde vragen
Is de les “Indexsignatures versus Record” gratis?
Ja — de volledige tekst van “Indexsignatures versus Record” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus TypeScript Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus TypeScript Academy bevat in totaal 4 lessen.
Wat leer ik in “Indexsignatures versus Record”?
Kies tussen indexsignatures en het utility type Record Je oefent met TypeScript Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met TypeScript Academy te beginnen?
Ervaring vooraf is niet nodig. TypeScript Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Indexsignatures versus Record”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over TypeScript Academy?
Ja. Elke les over TypeScript Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Indexsignatures definiëren
- String- versus number-indexsignatures
- Bekende en dynamische sleutels combineren
- Indexsignatures versus Record