ProgrammazioneSviluppatore Fullstack

Come funzionano i Tipi di Accesso Indicizzato (tipo accesso per indice, come T[K])? Quando usarli, come evitare errori durante la modifica della struttura del tipo, e qual è il loro ruolo in oggetti complessi?

Supera i colloqui con l'assistente IA Hintsage

Risposta

Tipi di Accesso Indicizzato (o tipi di accesso per indice) consentono di riferirsi al tipo di una proprietà specifica di un oggetto o di qualsiasi chiave attraverso la sintassi T[K]. Questo è uno strumento potente per creare astrazioni flessibili e sicure dal punto di vista del tipo.

Esempio:
type Person = { name: string; age: number; }; type NameType = Person['name']; // string type AgeOrName = Person['age' | 'name']; // number | string

È usato per scrivere tipi e funzioni generiche:

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; // corretta tipizzazione del ritorno } const user = { email: 'a@a.ru', id: 1 }; let id = getProperty(user, 'id'); // id: number

A cosa serve:

  • Per creare tipi costruttori (ad esempio, estrarre il tipo di un valore per chiave da strutture annidate complesse).
  • Costruzione di tipi ausiliari (Record, Pick, ecc.)

Sfide:

  • La modifica del tipo di origine (Person) cambia anche il risultato dell’accesso per indice, e questo può improvvisamente influenzare il binding in tutti i luoghi!
  • TS non cattura la situazione se la chiave non esiste: Person['salary'] — errore in fase di compilazione.

Domanda trabocchetto

Domanda: Quale tipo risulta dall'espressione type Foo = {a: number, b: string}["a" | "b" | "c"]?

Risposta: Questo esempio genererà un errore di compilazione, poiché 'c' non è una chiave nel tipo a cui si accede. TypeScript genererà l'errore:

Type '"c"' does not satisfy the constraint '"a" | "b"'.

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze del tema.


Storia

Nel progetto venivano generate dinamicamente forme basate su tipi. Dopo aver aggiunto un nuovo campo nel tipo principale, non sono stati aggiornati i luoghi con indicizzazione per chiavi, di conseguenza alcune proprietà non finivano nella forma, anche se a livello di tipo ci si aspettava una mappatura completa. L'errore si manifestava solo a runtime, non in fase di sviluppo.


Storia

Nella libreria per la validazione dei dati è stato utilizzato l'accesso indicizzato tramite tipi, ma durante la migrazione del codice è stato spostato una delle chiavi dall'oggetto al genitore. Il vecchio tipo indicizzato generava un errore di compilazione, tuttavia l'errore si verificava solo dopo la ricompilazione a causa della cache nel CI, e prima era presente su staging per diverse settimane.


Storia

Si credeva erroneamente che con i Tipi di Accesso Indicizzati fosse possibile accedere a qualsiasi chiave, anche se non era elencata esplicitamente, il che ha portato a una generazione errata dei test automatici per le proprietà dinamiche. Di conseguenza, i test non coprivano una parte degli scenari possibili, poiché il compilatore scartava questi casi come non validi.