L'équipe TypeScript a introduit un nouveau drapeau de compilation dans la version 6.0 : --noPropertyAccessFromIndexSignature. Lorsqu'il est activé, le compilateur refuse l'accès par notation pointée aux propriétés provenant d'une signature d'index, forçant les développeurs à utiliser la notation entre crochets et faisant apparaître les valeurs potentiellement undefined au moment de la compilation plutôt qu'en production.

Pourquoi ce drapeau est important

En JavaScript, les objets servent souvent de dictionnaires, et TypeScript vous permet de typer de telles structures avec une signature d'index, par exemple Record<string, T>. Le langage traite obj.key et obj["key"] comme interchangeables, le compilateur suppose donc que la propriété existe même lorsque la clé n'est connue qu'à l'exécution. Cette supposition silencieuse est la source de nombreux plantages : un code qui accède à obj.missingProp compile sans erreur, s'exécute, puis plante car la valeur est undefined.

La notation pointée porte une garantie implicite : elle indique aux lecteurs et au vérificateur de types que la propriété est certainement présente. La notation entre crochets, en revanche, signale une incertitude : la clé pourrait être absente et le résultat pourrait être undefined. --noPropertyAccessFromIndexSignature impose cette distinction visuelle et sémantique, transformant une classe d'erreurs d'exécution en diagnostics de compilation.

Comment fonctionne le drapeau

Lorsque le drapeau est activé, toute expression accédant à une propriété via une signature d'index par notation pointée est signalée comme une erreur. Le code doit être réécrit pour utiliser des crochets :

// Before
const name = userData.name;          // OK even if "name" is not in the index

// After enabling the flag
const name = userData["name"];       // Error unless brackets are used

Le compilateur applique ensuite les mêmes règles de gestion de undefined qu'il utilise déjà pour l'accès entre crochets. Si --noUncheckedIndexedAccess est également activé, le type de userData["name"] devient T | undefined, forçant le développeur à vérifier le cas d'absence.

Étapes de migration pratiques

  1. Activez le drapeau dans tsconfig.json :

    {
      "compilerOptions": {
        "noPropertyAccessFromIndexSignature": true
      }
    }
    
  2. Lancez le vérificateur de types. Tous les accès par notation pointée aux clés de signature d'index apparaîtront comme des erreurs.

  3. Remplacez les points par des crochets. Le changement est mécanique ; il n'affecte pas les performances à l'exécution.

  4. Traitez les types undefined résultants. Ajoutez la coalescence nulle (nullish coalescing), le chaînage optionnel ou des vérifications explicites si nécessaire.

  5. Envisagez de le coupler avec --noUncheckedIndexedAccess pour obtenir le filet de sécurité le plus robuste. Ensemble, ils garantissent que tout accès de type dictionnaire est traité comme potentiellement absent.

Quand conserver des propriétés explicites

Si un champ fait partie d'un contrat d'API stable, déclarez-le comme une propriété explicite plutôt que de vous appuyer sur une signature d'index. Les propriétés explicites continuent de permettre la notation pointée, préservant la garantie que le champ sera toujours présent (dans la mesure où le système de types peut le vérifier). Réservez les signatures d'index pour les données véritablement dynamiques dont les clés ne sont pas connues à l'avance.

Contre-point : une verbosité accrue

Certaines équipes pourraient trouver l'ajout de crochets bruyant, en particulier dans les bases de code qui utilisent massivement des objets flexibles. Le drapeau impose une discipline plus stricte qui peut nécessiter une refactorisation importante pour les projets existants. Dans ces cas, le drapeau peut être introduit progressivement, par exemple en le limitant aux nouveaux modules, pendant que le reste de la base de code adopte le modèle au fil du temps.

À surveiller ensuite

Ce drapeau s'inscrit dans une dynamique plus large de TypeScript 6.0 vers une sécurité de typage accrue. Les versions futures pourraient introduire des vérifications supplémentaires concernant la propagation d'objets (object spread), le chaînage optionnel ou l'utilisation de any par inférence. Garder un œil sur la feuille de route (roadmap) de TypeScript aidera les équipes à décider quand adopter la prochaine série de fonctionnalités de sécurité sans perturber les calendriers de livraison.

À retenir : L'activation de --noPropertyAccessFromIndexSignature rend explicite dans le code la distinction entre « cette propriété est garantie » et « cette propriété pourrait être absente », capturant ainsi toute une classe de bugs avant qu'ils n'atteignent la production. Transformer un échec silencieux à l'exécution en une erreur de compilation est un changement mineur ayant un impact disproportionné sur la fiabilité.