TypeScript Academy · leksjon

Indekssignaturer kontra Record

Velg mellom indekssignaturer og utility-typen Record.

Leksjon 4 av 413 trinn

Indekssignaturer kontra Record er en gratis leksjon i TypeScript Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i TypeScript Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i TypeScript Academy inneholder totalt 4 leksjoner.

To måter å angi typen til en ordbok

TypeScript tilbyr to vanlige måter å beskrive en ordbok på: en indekssignatur som { [k: string]: V }, og den innebygde verktøytypen Record<K, V>. De overlapper i stor grad, men leses forskjellig.

Verktøytypen Record

Record<K, V> konstruerer en objekttype der nøklene er K og verdiene er V. Når nøkkeltypen er string, tilsvarer den en strengindekssignatur.

type Scores = Record<string, number>
const game: Scores = { alice: 10, bob: 7 }
console.log(game.alice)

Tilsvarer en indekssignatur

Disse to typene beskriver samme form. Record<string, number> og { [key: string]: number } kan brukes om hverandre for vilkårlige strengnøkler.

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 med en union av bokstavelige nøkler

Den virkelige styrken til Record kommer til syne med en endelig union av bokstavelige nøkler. Den lager et objekt der hver oppførte nøkkel er påkrevd – noe en indekssignatur ikke kan uttrykke.

type Role = "admin" | "editor" | "viewer"
type Perms = Record<Role, boolean>
const p: Perms = { admin: true, editor: true, viewer: false }
console.log(p.admin)

Manglende nøkler oppdages

Fordi hver bokstavelige nøkkel er påkrevd, blir det en kompileringsfeil hvis du glemmer én. Dette er en sterk garanti som indekssignaturer ganske enkelt ikke kan gi.

type Role = "admin" | "editor" | "viewer"
// const bad: Record<Role, boolean> = { admin: true, editor: true }
// Error: property viewer is missing

Indekssignaturen tillater alle nøkler

Til sammenligning er en indekssignatur åpen. Du kan legge til nøkler som ikke er nevnt noe sted, og ingen nøkler må være til stede.

type Open = { [key: string]: number }
const o: Open = {}      // no keys required
o.anything = 1          // any key allowed
console.log(o.anything)

Endelige nøkkelsett: foretrekk Record

Når nøklene utgjør et kjent og endelig sett, er Record med en bokstavelig union tydeligere og sikrere. Det dokumenterer nøyaktig hvilke nøkler som finnes, og håndhever at alle er med.

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)

Åpne nøkkelsett: begge fungerer

Når nøklene er ubegrensede og oppdages ved kjøring, fungerer både Record<string, V> og en indekssignatur. Mange team velger Record fordi det er kortere, mens andre velger signaturen fordi den er mer eksplisitt.

type Cache1 = Record<string, string>
type Cache2 = { [url: string]: string }
const c: Cache1 = {}
c["/home"] = "<html>"
console.log(c["/home"])

Record er bare en mapped type

Under overflaten er Record<K, V> definert som en mapped type: { [P in K]: V }. Når du vet dette, blir det forståelig hvorfor en bokstavelig union gir påkrevde nøkler, mens string gir en indekssignatur.

// 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)

Navngitte nøkler pluss en samlesignatur

En indekssignatur kan kombinere en samlesignatur med faste nøkler i ett grensesnitt – praktisk når du trenger begge deler. Record alene kan ikke kombinere påkrevde navngitte nøkler med en åpen samlesignatur like ryddig.

interface Response {
  status: number
  [header: string]: number | string
}
const r: Response = { status: 200, "x-id": "abc" }
console.log(r.status)

Valg i praksis

Tommelfingerregel: endelige, kjente nøkler → Record<Union, V> for kontroll av fullstendighet. Ubegrensede nøkler → begge formene fungerer. Trenger du navngitte nøkler pluss en samlesignatur → bruk en indekssignatur i et grensesnitt.

type Status = "ok" | "error"
type Messages = Record<Status, string>
const msg: Messages = { ok: "done", error: "failed" }
console.log(msg.ok)

Kort test

Test forståelsen din av Record og indekssignaturer.

Oppsummering

Record<string, V> tilsvarer en strengindekssignatur, men Record med en bokstavelig nøkkelunion gjør hver oppførte nøkkel påkrevd og oppdager manglende nøkler ved kompilering. Bruk Record<Union, V> for endelige, kjente nøkler, begge former for ubegrensede nøkler, og en indekssignatur når du trenger navngitte nøkler pluss en samlesignatur. Under overflaten er Record den mappede typen { [P in K]: V }.

Gratis å komme i gang

Lær deg TypeScript med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
101
Leksjoner
352

Ofte stilte spørsmål

Er leksjonen «Indekssignaturer kontra Record» gratis?

Ja – hele teksten i «Indekssignaturer kontra Record» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av TypeScript Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i TypeScript Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Indekssignaturer kontra Record»?

Velg mellom indekssignaturer og utility-typen Record. Du øver på TypeScript Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med TypeScript Academy?

Ingen tidligere erfaring er nødvendig. TypeScript Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Indekssignaturer kontra Record»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne TypeScript Academy-leksjonen?

Ja. Alle TypeScript Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Definere indekssignaturer
  2. Indekssignaturer for string kontra number
  3. Kombinere kjente og dynamiske nøkler
  4. Indekssignaturer kontra Record
← Tilbake til TypeScript Academy