Bouw een Record<K, V>-type van uw eigen keys en zie het object dat het beschrijft. Leer wanneer Record beter is dan een index signature of een Map, en welke fouten het vangt.
Record<K, V> is een ingebouwd utility type voor een object waarvan de keys uit K komen en de waarden allemaal type V hebben. Geef het een union van string literals en de compiler eist dat elke genoemde key aanwezig is. Geef het gewoon string en het gedraagt zich als een open dictionary, net als een index signature.
Record in één oogopslag
U schrijft
Betekent
Ontbrekende key toegestaan?
Record<"a" | "b", number>
{ a: number; b: number }
Nee, beide keys verplicht
Record<string, number>
{ [key: string]: number }
Ja, elke string-key
Partial<Record<"a" | "b", number>>
{ a?: number; b?: number }
Ja, elke key optioneel
Record<number, string>
{ [key: number]: string }
Ja, elke number-key
Typ de keys die u wilt en kies een waardetype. De builder schrijft het Record-type, het gewone objecttype waarnaar het uitvouwt en een startobject met één regel per key, zodat u precies ziet waar de compiler u aan houdt voordat u het in uw code plakt.
Typ uw keys gescheiden door komma's, bijvoorbeeld home, about, contact.
Kies het waardetype dat elke key moet bevatten.
Vink optioneel aan als sommige keys mogen ontbreken; het type wordt dan in Partial gewikkeld.
Kopieer het type en het startobject naar uw bestand en vul de waarden in.
Leid de key-union af van data die u al hebt: keyof typeof someObject of (typeof list)[number] na een as const-array houdt de Record gelijk met de bron.
Gebruik Record<string, T> alleen als keys echt pas tijdens runtime binnenkomen. Een gesloten union vangt typefouten in property-namen die een open dictionary doorlaat.
Zet noUncheckedIndexedAccess aan als u uit Record<string, T> leest met een berekende key. Lezen geeft dan T | undefined, wat overeenkomt met wat er tijdens runtime gebeurt.
Vermijd Record<string, any>. Record<string, unknown> accepteert nog steeds elk object, maar dwingt een controle af voordat u een waarde gebruikt.
Veelgestelde vragen
Is Record hetzelfde als een index signature?
Met een brede key zoals string wel: Record<string, number> en { [key: string]: number } beschrijven dezelfde vorm. Het verschil blijkt bij letterlijke keys. Een index signature kan niet eisen dat specifieke namen bestaan, terwijl Record<"a" | "b", number> zowel a als b vereist.
Wanneer gebruik ik een Map in plaats van een Record?
Gebruik een Map als keys vaak worden toegevoegd en verwijderd, als keys geen strings zijn of als u het aantal entries via size nodig hebt. Gebruik een Record voor een vaste set namen, voor configuratieobjecten en voor alles wat u door JSON.stringify haalt.
Waarom zegt TypeScript dat er een property ontbreekt in mijn Record?
Omdat het key-type een union is en het object één lid weglaat. tsc meldt bijvoorbeeld Property 'about' is missing in type '{ home: string; }'. Voeg de key toe, of wikkel het type in Partial als weglaten geldig is.
Bestaat Record tijdens runtime?
Nee. Het is alleen een type en verdwijnt als de code wordt gecompileerd. Het object dat u maakt is een gewoon JavaScript-object, dus de compiler kan niet voorkomen dat een serverresponse extra of ontbrekende keys heeft.
In welke TypeScript-versie kwam Record erbij?
Record kwam in TypeScript 2.1, samen met Partial, Readonly en Pick, dus elke huidige compiler heeft het.
Hoe Record is opgebouwd
Record is een mapped type. Het loopt elk lid van het key-type langs en geeft elk lid hetzelfde waardetype. Daarom vouwt Record<"a" | "b", number> uit naar een objecttype met twee verplichte number-properties.
Omdat het gewoon een type is, kunt u het alles geven wat een property-key kan zijn: string literals, number, string, symbol of een union daarvan. Een key-type dat van een ander type is afgeleid, zoals keyof User, past zich vanzelf aan als User verandert.
Gesloten keys tegenover open keys
De waarde van Record zit in de gesloten vorm. Een opzoektabel met routenamen, statuslabels of themakleuren, getypeerd met een union van literals, breekt de build op de dag dat iemand een nieuwe status zonder label toevoegt, en dat is precies het moment waarop u het wilt weten.
De open vorm, Record<string, T>, beschrijft een dictionary. Die zegt niets over welke keys bestaan, dus het lezen van een key geeft T, ook als de key ontbreekt. Combineer het met noUncheckedIndexedAccess of een Map als dat gat ertoe doet.
Record, index signature of Map
Kies Record met letterlijke keys voor vaste opzoekingen, Record<string, T> of een index signature voor dictionaries in JSON-vorm, en Map voor collecties die veranderen terwijl het programma draait. De gids over Map in TypeScript op deze site behandelt dat laatste geval uitgebreid.
Patronen die u het vaakst gebruikt
Keys uit een as const-array
De array is de enige bron van waarheid. Voeg er een status aan toe en de compiler wijst naar de labeltabel tot u ook het label toevoegt.
Eén vlag per veld van een ander type
keyof maakt van een bestaand type de key-union, zodat het touched-object van een formulier altijd dezelfde velden noemt als het formulier.
Een open dictionary, veilig gelezen
Met noUncheckedIndexedAccess aan is lezen met een berekende key number | undefined, dus de fallback is verplicht in plaats van vergeten.
Record-typebuilder
Keys, gescheiden door komma's
Waardetype
Keys zijn optioneel (in Partial wikkelen)
Het type
Waarnaar het uitvouwt
Een startobject
Typ minstens één key. Keys moeten beginnen met een letter, _ of $.