Objetos TypeScript como tipos de diccionario como en C#

Resuelto Robert Taylor asked hace 12 años • 6 respuestas

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?

Robert Taylor avatar Nov 30 '12 00:11 Robert Taylor
Aceptado

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
Ryan Cavanaugh avatar Nov 29 '2012 17:11 Ryan Cavanaugh

Además de usar un objeto similar a un mapa , existe un Mapobjeto 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 Objecty 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, Objectno admite números, los convierte en cadenas)
  • Menos espacio para errores cuando no se usa --noImplicitAny, ya que Mapsiempre 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 unObject

Además, un Mapobjeto 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 Objectmensajes 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());
John Weisz avatar Feb 14 '2017 10:02 John Weisz