web-dev-qa-db-fra.com

Map <String, String> Dart équivalent dans Typescript?

J'essaie de trouver un équivalent à Map<String, String> dans Dart, mais utilisable dans TypeScript. Il s'agit d'un moyen rapide de définir une chaîne: chaîne clé: magasin de valeurs.

En outre, cela peut être utilisé comme ceci, qui est ma prochaine question:

Map<String, List<String>>

Cela définirait un magasin clé: valeur où les clés sont des chaînes et les valeurs sont une liste de chaînes.

Existe-t-il un moyen de le faire dans Typescript?

4
Luke Pighetti

Si les clés ne sont que des chaînes, vous préféreriez probablement utiliser des objets simples dans TypeScript, que vous pouvez taper comme Record<string, string>.
Exemple d'utilisation

4
Ebuall

L'équivalent TypeScript serait:

const m = new Map<string, string[]>();
m.set("fruit", ["Apple", "banana"]);

Notez que string[] est le type "tableau de chaînes" qui, malgré son nom, est une liste de chaînes évolutives dynamiquement (contrairement aux tableaux à longueur fixe dans de nombreux langages typés statiquement populaires).

Tu peux dire Array<string> à la place, mais c'est probablement moins utilisé.

Si votre clé est une chaîne, il peut être plus pratique d'utiliser un objet JS. Les objets dans JS sont essentiellement des cartes avec des clés de chaîne. Dans TS, l'exemple devient:

type StringToArrayOfStrings = { 
    [name: string]: string[] 
};

const m: StringToArrayOfStrings = {};
m["fruit"] = ["Apple", "banana"];

Dans la déclaration type, nous indiquons la signature de l'opérateur d'indexation [...]. (Il est possible d'avoir des touches numériques ainsi que des chaînes.)

MISE À JOUR

Toujours en utilisant un objet simple comme carte, notez que nous n'avons pas besoin d'utiliser une déclaration type pour donner un nom à un type. La déclaration de type peut être substituée sur place, et nous pouvons alors initialiser immédiatement m avec un objet compatible:

const m: { [name: string]: string[] } = {
    "fruit": ["Apple", "banana"],
    "spaceship": ["orion", "apollo"]
};

Notez que si nous omettons l'annotation de type sur m:

const m = {
    "fruit": ["Apple", "banana"],
    "spaceship": ["orion", "apollo"]
};

alors le type de m est supposé être plus restrictif:

{
    fruit: string[];
    spaceship: string[];
}

le compilateur supposera que nous voulons dire que m est bloqué en permanence avec seulement deux propriétés, fruit et spaceship, et ne nous permettra pas d'en ajouter plus. Fait intéressant, il n'assumera rien sur la longueur des tableaux (même il est possible de décrire de telles choses dans TS via des types de tuple).

5
Daniel Earwicker

TypeScript est un sur-ensemble de Javascript, qui a une classe Map intégrée . Cela peut prendre n'importe quelle paire clé/valeur, y compris String, List<String>. Eh bien, il n'y a pas de type List dans JS, mais vous pouvez utiliser Array à la place.

1
Mike Lischke