TypeScript Academy · Lektion

Indekssignaturer kontra Record

Vælg mellem indekssignaturer og utility-typen Record

Lektion 4 af 413 trin

Indekssignaturer kontra Record er en gratis TypeScript Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i TypeScript Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. TypeScript Academy-kurset indeholder 4 lektioner i alt.

To måder at angive typen på for en opslagstabel

TypeScript tilbyder to almindelige måder at beskrive en ordbog på: en indekssignatur som { [k: string]: V } og den indbyggede hjælpetype Record<K, V>. De overlapper i høj grad, men læses forskelligt.

Hjælpetypen Record

Record<K, V> konstruerer en objekttype, hvis nøgler er K, og hvis værdier er V. Med string som nøgle er den ækvivalent med en string-indekssignatur.

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

Ækvivalent med en indekssignatur

Disse to typer beskriver den samme form. Record<string, number> og { [key: string]: number } kan bruges om hinanden ved vilkårlige strengnøgler.

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 af bogstavelige nøgler

Den egentlige styrke ved Record viser sig med en endelig union af bogstavelige nøgler. Den producerer et objekt, hvor hver angivet nøgle er påkrævet — noget en indekssignatur ikke kan udtrykke.

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øgler opdages

Fordi hver bogstavelig nøgle er påkrævet, giver det en kompileringsfejl, hvis du glemmer én. Det er en stærk garanti, som indekssignaturer ganske enkelt ikke kan give.

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

Indekssignaturen tillader enhver nøgle

En indekssignatur er derimod åben. Du kan tilføje nøgler, der aldrig er nævnt noget sted, og intet behøver at 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)

Faste nøglesæt: Foretræk Record

Når nøglerne udgør et kendt, endeligt sæt, er Record med en union af bogstavelige nøgler tydeligere og sikrere. Den dokumenterer præcis, hvilke nøgler der findes, og håndhæver fuldstændighed.

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)

Åbne nøglesæt: Begge dele fungerer

Når nøglerne er ubegrænsede og findes ved kørsel, fungerer både Record<string, V> og en indekssignatur. Mange teams vælger Record for kortfattethed, mens andre vælger signaturen for tydelighed.

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

Record er blot en type med nøgleafbildning

Under overfladen er Record<K, V> defineret som en type med nøgleafbildning: { [P in K]: V }. Det forklarer, hvorfor en union af bogstavelige nøgler giver påkrævede nøgler, mens string giver 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)

Navngivne nøgler plus en generel signatur

En indekssignatur kan kombinere en generel signatur med faste nøgler i ét interface — praktisk, når du har brug for begge dele. Record alene kan ikke lige så enkelt kombinere påkrævede navngivne nøgler med en åben generel signatur.

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

Valg i praksis

En tommelfingerregel: Faste, kendte nøgler → Record<Union, V> for kontrol af fuldstændighed. Ubegrænsede nøgler → begge former fungerer. Har du brug for navngivne nøgler plus en generel signatur → brug en indekssignatur i et interface.

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

Hurtigt tjek

Test din forståelse af Record sammenlignet med indekssignaturer.

Opsamling

Record<string, V> svarer til en string-indekssignatur, men Record med en union af bogstavelige nøgler gør hver angivet nøgle påkrævet og opdager udeladelser ved kompilering. Brug Record<Union, V> til faste, kendte nøgler, begge former til ubegrænsede nøgler og en indekssignatur, når du har brug for navngivne nøgler plus en generel signatur. Under overfladen er Record typen med nøgleafbildning { [P in K]: V }.

Gratis at komme i gang

Lær TypeScript med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
101
Lektioner
352

Ofte stillede spørgsmål

Er lektionen “Indekssignaturer kontra Record” gratis?

Ja — hele teksten til “Indekssignaturer kontra Record” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af TypeScript Academy-kurset, skal du opgradere til CoddyKit PRO. TypeScript Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Indekssignaturer kontra Record”?

Vælg mellem indekssignaturer og utility-typen Record Du øver dig i TypeScript Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på TypeScript Academy?

Der kræves ingen tidligere erfaring. TypeScript Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Indekssignaturer kontra Record”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne TypeScript Academy-lektion?

Ja. Alle TypeScript Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Definition af indekssignaturer
  2. String- kontra number-indekssignaturer
  3. Kombination af kendte og dynamiske nøgler
  4. Indekssignaturer kontra Record
← Tilbage til TypeScript Academy