Dans TypeScript, les tableaux sont décrits de deux manières principales : type[] et Array<type>. Pour les tableaux contenant des éléments de différents types, on utilise les types unis (union types) ou les tuples, qui permettent de décrire un ensemble fixe d'éléments de types et de quantités différents.
Déclarations de tableaux :
let numbers: number[] = [1, 2, 3]; let strings: Array<string> = ['a', 'b', 'c'];
Tableau avec des éléments de types différents :
let mixed: (string | number)[] = [1, 'a', 2];
Tuples :
let tuple: [string, number, boolean] = ['hello', 42, true];
Avec les tuples, il est plus pratique de travailler lorsque l'on attend une structure fixe (par exemple, retourner plusieurs valeurs de types différents d'une fonction), alors qu'avec les tableaux, le nombre et le type des éléments peuvent être mélangés ou inconnus à l'avance.
Peut-on ajouter des éléments à un tuple de longueur N après sa définition en utilisant push ? Qu'est-ce que cela implique pour la typage ?
Réponse : Oui, il est possible de pousser dans un tuple — le compilateur le permet, bien que cela viole l'hypothèse de limitation du tuple en longueur. Les types des nouveaux éléments seront convertis en une union de tous les types possibles des éléments du tuple :
let tuple: [number, string] = [42, 'foo']; tuple.push(true); // OK ! tuple maintenant : [number, string, boolean], mais le type n'est pas mis à jour, et il n'y a pas d'erreur ! console.log(tuple); // [42, 'foo', true]
Par conséquent, le travail avec des tuples et leur mutabilité doit être contrôlé manuellement ou les rendre en lecture seule.
Histoire
Le développeur a décrit une fonction retournant un tuple [number, string], mais a ensuite commencé à ajouter des éléments au résultat via push. Cela a conduit à une désynchronisation des types : le code suivant s'attendait à exactement deux éléments avec des types définis, mais recevait un tableau de longueur variable, ce qui a causé des erreurs d'exécution lors du déballage des valeurs et de la lecture d'indices inexistants.
Histoire
Pour stocker un tableau de valeurs de différents types, un tableau any[] a été utilisé, en pensant que c'était une solution universelle. En conséquence, TypeScript a cessé de vérifier la validité des types, et la logique de l'application a commencé à "casser" en raison de conversions de types incorrectes qui ne causaient pas d'erreurs de compilation.
Histoire
Dans le projet, le tableau était décrit soit via type[], soit via Array<type> — mais en certains endroits, une déclaration let arr: any[] était autorisée (pour travailler "avec n'importe quoi"). Cela a entraîné des transformations incontrôlées, la fonction acceptait n'importe quel tableau, ce qui causait des erreurs d'exécution lors de la tentative d'appel de méthodes incorrectes pour des éléments de types différents.