ProgrammationDéveloppeur Fullstack

Comment fonctionnent les Types d'Accès Indexés (type d'accès par index, comme T[K]) ? Quand les utiliser, comment éviter les erreurs lors de la modification de la structure du type, et quel est leur rôle dans les objets complexes ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Types d'Accès Indexés (ou types d'accès par index) permettent de référencer le type d'une propriété spécifique d'un objet ou de n'importe quelle clé à l'aide de la syntaxe T[K]. C'est un outil puissant pour créer des abstractions flexibles et type-sûres.

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

Utilisé pour écrire des types et des fonctions génériques :

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

À quoi ça sert :

  • Pour créer des types de constructeurs (par exemple, extraire le type de valeur par clé à partir de structures imbriquées complexes).
  • Construction de types associés (Record, Pick, etc.)

Nuances :

  • Lors de la modification du type d'origine (Person), le résultat de l'accès par index change également, ce qui peut affecter soudainement le lien dans tous les endroits !
  • TS ne capture pas la situation si la clé n'existe pas : Person['salary'] — erreur à la compilation.

Question piège

Question : Quel type résulte de l'expression type Foo = {a: number, b: string}["a" | "b" | "c"] ?

Réponse : Cet exemple générera une erreur de compilation, car 'c' n'est pas une clé dans le type auquel on accède. TypeScript générera l'erreur :

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

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Dans le projet, des formulaires étaient générés dynamiquement à partir des types. Après l'ajout d'un nouveau champ dans le type principal, les endroits avec indexation par clé n'ont pas été mis à jour, entraînant l'oubli de certaines propriétés dans le formulaire, bien que sur le plan typé, un mappage complet était attendu. L'erreur n'apparaissait qu'à l'exécution, et non au stade de développement.


Histoire

Dans une bibliothèque de validation de données, l'accès indexé à travers les types a été utilisé, mais lors de la migration du code, une des clés a été déplacée de l'objet vers le parent. L'ancien type d'accès indexé a provoqué une erreur de compilation, mais l'erreur n'est survenue qu'après la reconstruction à cause du cache dans le CI, et avant cela a vécu sur le staging pendant plusieurs semaines.


Histoire

On pensait à tort qu'avec les Types d'Accès Indexés, il était possible d'accéder à n'importe quelle clé, même si elle n'était pas explicitement énumérée, ce qui a entraîné une génération incorrecte des tests automatisés pour les propriétés dynamiques. En conséquence, les tests ne couvraient pas une partie des scénarios possibles, car le compilateur rejetait ces cas comme non valides.