0Pricing
TypeScript Academy · Lezione

Index signature e Record a confronto

Scelga tra index signature e il tipo di utilità Record.

Index signature e Record a confronto è una lezione TypeScript Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento TypeScript Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso TypeScript Academy include 4 lezioni in totale.

Due modi per tipizzare una mappa

TypeScript offre due modi comuni per descrivere un dizionario: una index signature come { [k: string]: V } e il tipo utility integrato Record<K, V>. Si sovrappongono ampiamente, ma hanno una forma diversa.

Il tipo utility Record

Record<K, V> costruisce un tipo di oggetto le cui chiavi sono K e i cui valori sono V. Con string come chiave, è equivalente a una index signature string.

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

Equivalente a una index signature

Questi due tipi descrivono la stessa struttura. Record<string, number> e { [key: string]: number } sono intercambiabili per chiavi stringa arbitrarie.

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 con una union di chiavi letterali

Il vero vantaggio di Record emerge con una union finita di chiavi letterali. Produce un oggetto in cui ogni chiave elencata è obbligatoria, cosa che una index signature non può esprimere.

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

Le chiavi mancanti vengono rilevate

Poiché ogni chiave letterale è obbligatoria, dimenticarne una causa un errore di compilazione. È una garanzia importante che le index signature semplicemente non possono offrire.

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

La index signature consente qualsiasi chiave

Al contrario, una index signature è aperta. Può aggiungere chiavi mai menzionate altrove e non è obbligatorio che ne sia presente alcuna.

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

Insiemi finiti di chiavi: preferire Record

Quando le chiavi appartengono a un insieme finito e noto, Record con una union letterale è più chiaro e sicuro. Documenta esattamente quali chiavi esistono e ne impone la completezza.

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)

Insiemi aperti di chiavi: entrambe le opzioni funzionano

Quando le chiavi sono illimitate e vengono determinate a runtime, funzionano sia Record<string, V> sia una index signature. Molti team scelgono Record per brevità, mentre altri preferiscono la signature per maggiore esplicitezza.

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

Record è solo un mapped type

Internamente, Record<K, V> è definito come un mapped type: { [P in K]: V }. Questo spiega perché una union letterale produce chiavi obbligatorie, mentre string produce una index signature.

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

Chiavi con nome e regola generale

Una index signature può combinare una regola generale con chiavi fisse in una sola interfaccia, utile quando servono entrambe. Record da solo non può combinare in modo altrettanto semplice chiavi nominate obbligatorie con una regola generale aperta.

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

La scelta nella pratica

Regola pratica: chiavi finite e note → Record<Union, V> per verificare la completezza. Chiavi illimitate → entrambe le forme. Chiavi nominate più una regola generale → una index signature all'interno di un'interfaccia.

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

Verifica rapida

Verifichi la comprensione delle differenze tra Record e le index signature.

Riepilogo

Record<string, V> equivale a una index signature string, ma Record con una union di chiavi letterali rende obbligatoria ogni chiave elencata, rilevando le omissioni in fase di compilazione. Utilizzi Record<Union, V> per chiavi finite e note, entrambe le forme per chiavi illimitate e una index signature quando servono chiavi nominate insieme a una regola generale. Internamente, Record è il mapped type { [P in K]: V }.

Domande Frequenti

La lezione «Index signature e Record a confronto» è gratuita?

Sì — il testo completo di «Index signature e Record a confronto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso TypeScript Academy, passa a CoddyKit PRO. Il corso TypeScript Academy include 4 lezioni in totale.

Cosa imparerò in «Index signature e Record a confronto»?

Scelga tra index signature e il tipo di utilità Record. Eserciti TypeScript Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare TypeScript Academy?

Non è richiesta alcuna esperienza precedente. TypeScript Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Index signature e Record a confronto»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione TypeScript Academy?

Sì. Ogni lezione TypeScript Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Definire le index signature
  2. Index signature stringa e numerica a confronto
  3. Combinare chiavi note e dinamiche
  4. Index signature e Record a confronto
← Torna a TypeScript Academy