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.
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
Person['salary'] — errore in fase di compilazione.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"'.
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.