ProgrammationDéveloppeur Backend

Comment décrire les types pour des structures de données complexes (par exemple, objets imbriqués, tableaux avec différents types) en TypeScript ? Quelles sont les approches disponibles et quels pièges rencontrons-nous généralement ? Donnez des exemples pratiques.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Pour décrire des structures de données complexes en TypeScript, on utilise des interfaces (interface) et des alias de type (type). On peut les combiner avec des objets, des tableaux et des types imbriqués pour une typage stricte des collections complexes.

Pour un objet imbriqué :

interface Address { city: string; zip: number; } interface UserProfile { name: string; age: number; address: Address; }

Pour un tableau avec différents types :

// Tuple let tuple: [string, number] = ['John', 30]; // Tableaux avec des types unions let arr: (string | number)[] = [1, 'a', 2, 'b']; // Tableau d'objets let users: UserProfile[] = [ {...}, {...} ];

Lorsque les structures sont complexes et qu'il y a des champs optionnels, on utilise ?, combiné avec des types Partial, Record, Mapped Types, ou des types récursifs pour des arbres imbriqués.

Question piège.

Question : Peut-on utiliser une interface pour décrire un tableau contenant des éléments de types différents (par exemple, [string, number, boolean]) ?

Réponse : Non. Dans ce cas, il est préférable d'utiliser des tuples — les interfaces ne conviennent pas pour des positions et types fixes. Les tuples permettent de définir strictement les types pour chaque position.

type MyTuple = [string, number, boolean]; let foo: MyTuple = ['ok', 12, false];

Exemples réels d'erreurs dues à l'ignorance des subtilités du sujet.


Histoire

Dans un projet, une structure complexe a été mal décrite : pour un tableau de types mélangés, any[] a été utilisé au lieu d'un tuple correct ou d'un type union. En conséquence, l'un des éléments contenait une valeur d'un type incorrect, ce qui a conduit à une erreur dans la logique métier (opération arithmétique sur une chaîne).


Histoire

Dans la structure de données, des objets profondément imbriqués ont été déclarés sans utiliser de types récursifs ou Partial. Tenter d'ajouter un nouveau sous-arbre à un nœud de l'arbre a provoqué une erreur du compilateur, et les développeurs contournaient cela par un downcast en any, ce qui a ensuite causé des bogues à l'exécution en production.


Histoire

L'objet décrivant le profil utilisateur était partiellement optionnel, mais le développeur n'a pas utilisé ?. Lors de la récupération des données du serveur, TypeScript ne s'est pas plaint, mais l'application a planté en essayant d'accéder à des champs qui n'existaient pas dans l'objet.