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.
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
Person['salary'] — erreur à la compilation.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"'.
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.