Objetos TypeScript como tipos de diccionario como en C#
Tengo un código JavaScript que usa objetos como diccionarios; por ejemplo, un objeto 'persona' contendrá algunos datos personales eliminados de la dirección de correo electrónico.
var people = {<email> : <'some personal data'>};
adding > "people[<email>] = <data>;"
getting > "var data = people[<email>];"
deleting > "delete people[<email>];"
¿Es posible describir esto en mecanografiado? ¿O tengo que usar un Array?
En versiones más nuevas de mecanografiado puedes usar:
type Customers = Record<string, Customer>
En versiones anteriores puedes usar:
var map: { [email: string]: Customer; } = { };
map['[email protected]'] = new Customer(); // OK
map[14] = new Customer(); // Not OK, 14 is not a string
map['[email protected]'] = 'x'; // Not OK, 'x' is not a customer
También puedes crear una interfaz si no quieres escribir esa anotación de tipo completa cada vez:
interface StringToCustomerMap {
[email: string]: Customer;
}
var map: StringToCustomerMap = { };
// Equivalent to first line of above
Además de usar un objeto similar a un mapa , existe un Map
objeto real desde hace algún tiempo, que está disponible en TypeScript cuando se compila en ES6 o cuando se usa un polyfill con las definiciones de tipo de ES6 :
let people = new Map<string, Person>();
Admite la misma funcionalidad que Object
y más, con una sintaxis ligeramente diferente:
// 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");
Esto por sí solo tiene varias ventajas sobre el uso de un objeto similar a un mapa , como por ejemplo:
- Compatibilidad con claves que no están basadas en cadenas, por ejemplo, números u objetos, ninguno de los cuales es compatible con
Object
(no,Object
no admite números, los convierte en cadenas) - Menos espacio para errores cuando no se usa
--noImplicitAny
, ya queMap
siempre tiene un tipo de clave y un tipo de valor , mientras que un objeto puede no tener una firma de índice. - La funcionalidad de agregar/eliminar elementos (pares clave-valor) está optimizada para la tarea, a diferencia de crear propiedades en un
Object
Además, un Map
objeto proporciona una API más potente y elegante para tareas comunes, la mayoría de las cuales no están disponibles a través de Object
mensajes de correo electrónico simples sin piratear funciones auxiliares (aunque algunas de ellas requieren un iterador ES6 completo/polyfill iterable para objetivos ES5 o inferiores):
// 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());