En plus d'utiliser un objet de type carte , il existe depuis un certain temps un Map
objet réel , qui est disponible dans TypeScript lors de la compilation vers ES6, ou lors de l'utilisation d'un polyfill avec les définitions de type ES6 :
let people = new Map<string, Person>();
Il prend en charge les mêmes fonctionnalités que Object
, et plus, avec une syntaxe légèrement différente:
// Adding an item (a key-value pair):
people.set("John", { firstName: "John", lastName: "Doe" });
// Checking for the presence of a key:
people.has("John"); // true
// Retrieving a value by a key:
people.get("John").lastName; // "Doe"
// Deleting an item by a key:
people.delete("John");
Cela seul a plusieurs avantages par rapport à l'utilisation d'un objet de type carte , comme:
- Prise en charge des clés non basées sur des chaînes, par exemple des nombres ou des objets, dont aucun n'est pris en charge par
Object
(non, Object
ne prend pas en charge les nombres, il les convertit en chaînes)
- Moins de place pour les erreurs lors de la non-utilisation
--noImplicitAny
, car a Map
toujours un type de clé et un type de valeur , alors qu'un objet peut ne pas avoir de signature d'index
- La fonctionnalité d'ajout / suppression d'éléments (paires clé-valeur) est optimisée pour la tâche, contrairement à la création de propriétés sur un
Object
De plus, un Map
objet fournit une API plus puissante et élégante pour les tâches courantes, dont la plupart ne sont pas disponibles via de simples Object
s sans pirater ensemble les fonctions d'assistance (bien que certaines d'entre elles nécessitent un itérateur ES6 complet / polyfill itérable pour les cibles ES5 ou inférieures):
// Iterate over Map entries:
people.forEach((person, key) => ...);
// Clear the Map:
people.clear();
// Get Map size:
people.size;
// Extract keys into array (in insertion order):
let keys = Array.from(people.keys());
// Extract values into array (in insertion order):
let values = Array.from(people.values());