В дополнении к использованию Map- как объект, там был фактический Map
объект в течение некоторого времени, которое доступно в машинописном при компиляции в ES6, или при использовании polyfill с ES6 типовыми определениями :
let people = new Map<string, Person>();
Он поддерживает те же функции Object
, что и многие другие, с немного другим синтаксисом:
// 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");
Это само по себе имеет несколько преимуществ перед использованием подобного карте объекта, такого как:
- Поддержка нестроковых ключей, например чисел или объектов, ни один из которых не поддерживается
Object
(нет, Object
не поддерживает числа, он преобразует их в строки)
- Меньше места для ошибок, когда не используется
--noImplicitAny
, так как Map
всегда имеет тип ключа и тип значения , тогда как объект может не иметь подписи индекса
- Функциональность добавления / удаления элементов (пар ключ-значение) оптимизирована для задачи, в отличие от создания свойств в
Object
Кроме того, Map
объект предоставляет более мощный и элегантный API для общих задач, большинство из которых недоступны через простые Object
s без взлома вспомогательных функций (хотя для некоторых из них требуется полный итератор ES6 / итеративный полифилл для целей ES5 или ниже):
// 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());