J'ai du code JavaScript qui utilise des objets comme dictionnaires; par exemple, un objet "personne" contiendra des informations personnelles saisies sur l'adresse e-mail.
var people = {<email> : <'some personal data'>};
adding > "people[<email>] = <data>;"
getting > "var data = people[<email>];"
deleting > "delete people[<email>];"
Est-il possible de décrire cela dans Typescript? ou dois-je utiliser un tableau?
arrays
object
dictionary
typescript
Robert Taylor
la source
la source
Réponses:
Dans les versions plus récentes de tapuscrit, vous pouvez utiliser:
Dans les anciennes versions, vous pouvez utiliser:
Vous pouvez également créer une interface si vous ne voulez pas taper cette annotation de type entière à chaque fois:
la source
map
contient deux membres: (<any> Object.prototype) .something = function () {}; classe Client {} var map: {[email: string]: Client; } = {}; map ['[email protected] '] = nouveau client (); pour (var i dans la carte) {console.log (map [i])}var map:MapStringTo<Customer> = {};
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 :Il prend en charge les mêmes fonctionnalités que
Object
, et plus, avec une syntaxe légèrement différente:Cela seul a plusieurs avantages par rapport à l'utilisation d'un objet de type carte , comme:
Object
(non,Object
ne prend pas en charge les nombres, il les convertit en chaînes)--noImplicitAny
, car aMap
toujours un type de clé et un type de valeur , alors qu'un objet peut ne pas avoir de signature d'indexObject
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 simplesObject
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):la source
JSON.stringify()
, il peut donc être utilisé par exemple pour socket.io :(Map
sérialisation est plutôt drôle. Pour ma part, j'effectue une conversion en objets paire-valeur-clé avant de sérialiser, puis en arrière (par exemple, objet de{ key: "John", value: { firstName: "John" } }
).Vous pouvez utiliser des interfaces modèles comme ceci:
la source
let dict: Dictionary<number> = { "one": 1, "two": 2 };
Vous pouvez également utiliser le type d'enregistrement en tapuscrit:
la source
Lodash a une implémentation de dictionnaire simple et un bon support TypeScript
Installez Lodash:
Importation et utilisation:
la source
Vous pouvez utiliser
Record
pour cela:https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt
Exemple (mappage entre l'énumération AppointmentStatus et certaines métadonnées):
Maintenant avec l'interface comme valeur:
interface Icon { Name: string Color: string }
Usage:
const icon: SemanticIcon = iconMapping[appointment.Status]
la source
enum
ou unclass/object
forAppointmentStatus
- ou est-ce important?Il existe une bibliothèque qui fournit des collections fortement typées et interrogeables en caractères dactylographiés.
Les collections sont:
La bibliothèque s'appelle ts-generic-collections . ( Code source sur GitHub )
Vous pouvez créer un dictionnaire et l'interroger comme ci-dessous:
la source