ProgrammazioneFrontend Developer

Come funziona meccanismo dei tipi estensibili (index signatures) in TypeScript? A cosa serve, quali sono le sue sottigliezze e quali rischi ci sono nella progettazione di tali strutture?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Storia della domanda

TypeScript consente di descrivere oggetti con nomi di proprietà dinamici, quando non è possibile determinare in anticipo tutte le chiavi. A tal fine, si utilizzano le index signatures, emerse come modo per tipizzare oggetti variabili (mappe, dati da un server esterno, ecc.).

Problema

Senza index signature, l'oggetto viene percepito solo in base a chiavi predefinite, qualsiasi altra chiave genererà un errore di compilazione. Inoltre, una dichiarazione non corretta della firma può sfumare i tipi di tutte le proprietà dell'oggetto, ridurre la severità dei tipi e portare a bug.

Soluzione

Dichiarate esplicitamente l'index signature solo dove è giustificato. Per tipizzare un array di oggetti in base a una chiave di stringa, utilizzate la seguente forma:

Esempio di codice:

interface Dictionary { [key: string]: number; length?: number; } const sample: Dictionary = { apples: 4, oranges: 10 }; sample['bananas'] = 6;

Caratteristiche chiave:

  • Consente di descrivere collezioni con chiavi arbitrarie
  • Si basa su un unico tipo di valore per tutti gli elementi
  • A causa della firma, tutte le proprietà aggiuntive devono corrispondere a questo tipo

Domande ingannevoli.

È possibile specificare diversi tipi di valori per diverse chiavi nell'index signature?

No, il tipo si applica all'intero insieme di chiavi, se si specifica [key: string]: number, anche sample.length deve essere number: questo frequentemente causa errori quando si combinano index signature e proprietà note.

È possibile utilizzare index signature con simboli (symbol)?

Sì, a partire da ES6 TypeScript supporta index signature per simboli:

interface SymbolMap { [key: symbol]: string; }

Cosa succederà se si dichiara un oggetto con index signature e proprietà aggiuntive di un altro tipo?

Il compilatore restituirà un errore se il tipo della proprietà non è compatibile con il tipo di valore dichiarato nell'index signature. Questo può essere aggirato utilizzando un tipo union o portando tali campi in un'interfaccia separata.

Errori tipici e anti-pattern

  • Uso eccessivo di index signature invece di interfacce rigorose
  • Sfumature dei tipi degli oggetti
  • Combinazioni errate di proprietà note e indicizzate

Esempio dalla vita reale

Caso negativo

Per qualsiasi risposta dal server veniva utilizzata l'interfaccia {[key: string]: any}, il che portava a bug penetranti a causa della perdita di controllo sulla struttura dei dati.

Vantaggi:

  • Universalità

Svantaggi:

  • Perdita completa della tipizzazione rigorosa all'interno dell'oggetto
  • Bug nascosti, "sorprese" in produzione

Caso positivo

Utilizzo di index signature rigorosamente per dizionari (ad esempio, configurazione per chiave), e proprietà note solo con dichiarazione del loro tipo al di fuori della firma.

Vantaggi:

  • Struttura chiara per collezioni/mappa
  • Mantiene la tipizzazione rigorosa per i campi noti

Svantaggi:

  • Richiede più tempo per progettare l'architettura corretta degli oggetti