arrays - recorrer - TypeScript Objetos como tipos de diccionario como en C#
lista de objetos javascript (5)
Además de usar un objeto similar a un Map
, ha existido un objeto Map
real durante algún tiempo, que está disponible en TypeScript cuando se compila en ES6, o cuando se usa un polyfill con las type-definitions ES6:
let people = new Map<string, Person>();
Es compatible con 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 solo tiene varias ventajas sobre el uso de un objeto similar a un mapa, como:
- Compatibilidad con claves no basadas en cadenas, p. Ej., 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 utiliza
--noImplicitAny
, ya que unMap
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 objeto Map
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 los Object
simples sin piratear las funciones de ayuda (aunque algunas de ellas requieren un iterador de ES6 completo o un polyfill iterable para objetivos de ES5 o inferior) :
// 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());
Tengo un código JavaScript que utiliza objetos como diccionarios; por ejemplo, un objeto ''persona'' guardará algunos detalles personales borrados 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 Typescript? o tengo que usar una matriz?
Lodash tiene una implementación de diccionario simple y tiene buen soporte para TypeScript
Instale Lodash:
npm install lodash @types/lodash --save
Importación y uso:
import { Dictionary } from "lodash";
let properties : Dictionary<string> = {
"key": "value"
}
console.log(properties["key"])
Por supuesto:
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 puede crear una interfaz si no desea escribir esa anotación de tipo completo cada vez:
interface StringToCustomerMap {
[email: string]: Customer;
}
var map: StringToCustomerMap = { };
// Equivalent to first line of above
Puedes usar interfaces con plantillas como esta:
interface Map<T> {
[K: string]: T;
}
let dict: Map<number> = {};
dict["one"] = 1;
También puede utilizar el tipo de registro en mecanografiado:
export interface nameInterface {
propName : Record<string, otherComplexInterface>
}