EDIT (5 juin 2019): Alors que l'idée que "TypeScript prend Map
en charge nativement" est toujours vraie, puisque la version 2.1 TypeScript prend en charge quelque chose appelé Record
.
type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
"a": { name: "joe" },
"b": { name: "bart" },
};
Malheureusement, le premier paramètre générique (type de clé) n'est toujours pas pleinement respecté: même avec un string
type, quelque chose comme peopleA[0]
(a number
) est toujours valide.
EDIT (25 avril 2016): La réponse ci-dessous est ancienne et ne doit pas être considérée comme la meilleure réponse. TypeScript prend désormais en charge les cartes "nativement", donc il permet simplement d'utiliser les cartes ES6 lorsque la sortie est ES6. Pour ES5, il ne fournit pas de polyfills; vous devez les intégrer vous-même.
Pour plus d'informations, reportez-vous à la réponse de mohamed hegazy ci-dessous pour une réponse plus moderne, ou même à ce commentaire reddit pour une version courte.
Depuis la version 1.5.0 beta, TypeScript ne prend pas encore en charge les cartes . Cela ne fait pas encore partie de la feuille de route non plus.
La meilleure solution actuelle est un objet avec une clé et une valeur tapées (parfois appelé hashmap). Pour un objet avec des clés de type string
et des valeurs de type number
:
var arr : { [key:string]:number; } = {};
Quelques mises en garde, cependant:
- les clés ne peuvent être que de type
string
ounumber
- Peu importe ce que vous utilisez comme type de clé, car les nombres / chaînes sont toujours acceptés de manière interchangeable (seule la valeur est appliquée).
Avec l'exemple ci-dessus:
// OK:
arr["name"] = 1; // String key is fine
arr[0] = 0; // Number key is fine too
// Not OK:
arr[{ a: "a" }] = 2; // Invalid key
arr[3] = "name"; // Invalid value