La paire clé-valeur est-elle disponible dans Typescript?


132

La paire clé / valeur est-elle disponible en typographie? Si oui, comment faire cela. Quelqu'un peut-il fournir des exemples de liens.


oui, pouvez-vous spécifier vos besoins?
— Taha Naqvi

typescript transpiles (non compilés) en javascript, donc toutes les fonctionnalités de javascript sont disponibles dans typescript. par exemple, si vous écrivez votre code en js et changez son extension en .ts, cela fonctionnera aussi bien que votre code js. en savoir plus sur: - typescriptlang.org/docs .
— Ajay le

Réponses:


176

La paire clé-valeur est-elle disponible dans Typescript?

Oui. Appelé une signature d'index :

interface Foo {
   [key: string]: Bar;
} 
let foo:Foo = {};

Voici les clés stringet les valeurs Bar.

Plus

Vous pouvez utiliser un es6 Mappour les dictionnaires appropriés, rempli parcore-js .


1
Ceci est une carte ou un dictionnaire. Si vous voulez quelque chose d'équivalent à un C # KeyValuePair, voir la réponse stackoverflow.com/questions/36467469/...
— Jack Miller

4
Aussi agréable à savoir, vous n'avez pas besoin de l'appeler key. Vous pouvez, par exemple, écrire aussi ceci: [countryCode: string]: string. Bien pour la lisibilité.
— Jeff Huijsmans


131

Le moyen le plus simple serait quelque chose comme:

var indexedArray: {[key: string]: number}

Usage:

var indexedArray: {[key: string]: number} = {
    foo: 2118,
    bar: 2118
}

indexedArray['foo'] = 2118;
indexedArray.foo= 2118;

let foo = indexedArray['myKey'];
let bar = indexedArray.myKey;

3
Cela a beaucoup aidé - Moins de code que l'approche d'interface car il ne nécessite pas de descriptionBar
— TheGeekZn

Avez-vous un exemple d'utilisation de cela?
— trebor74

1
indexedArray = {}; indexedArray ["un"] = 1; / * bon * / indexedArray ["deux"] = "deux"; / échoue * /
— Jaime

23

La paire clé-valeur est-elle disponible dans Typescript?

Si vous pensez à un C # KeyValuePair <string, string> : Non, mais vous pouvez facilement en définir un vous-même:

interface KeyValuePair {
    key: string;
    value: string;
}

Usage:

let foo: KeyValuePair = { key: "k", value: "val" };

4
Un peu drôle, déjà 6 votes avec une somme de 0. Est-ce que les downvoters voudraient ajouter un commentaire sur ce qui est mauvais dans cette solution?
— Jack Miller

7
Moi aussi je voudrais savoir. Les électeurs de Down ne laissent jamais de commentaire, je pense parfois car eux-mêmes ne connaissent pas de meilleure solution.
— Ruan

Je n'ai pas voté contre mais cette solution n'a pas d'ajout, d'obtention, de suppression, etc.
— DaNeSh

2
@DaNeSh C'est vrai. A KeyValuePairn'est pas une liste, mais cela pourrait être une entrée d'une liste. Vous cherchez peut-être un List<>? Voir stackoverflow.com/questions/23096260/…
— Jack Miller

Comment utiliser la clé pour obtenir la valeur? est-ce comme: keyValuePair ["k"]?
— Heisenberg

15

Pas pour le questionneur, mais pour tous les autres, qui sont intéressés: Voir: Comment définir la carte Typescript de la paire clé / valeur. où key est un nombre et valeur est un tableau d'objets

La solution est donc:

let yourVar: Map<YourKeyType, YourValueType>;
// now you can use it:
yourVar = new Map<YourKeyType, YourValueType>();
yourVar[YourKeyType] = <YourValueType> yourValue;

À votre santé!


Où est Mapdéfini? Est-ce spécifique à Angular?
— Jack Miller


1
yourVar [YourKeyType] = XXX. Cela ne définit pas d'élément dans la carte. Cela définit une propriété.
— mcoolive

Le navigateur IE ne prend pas en charge Map, aucune alternative?
— Rahul Upadhyay

12

Un autre moyen simple consiste à utiliser un tuple :

// Declare a tuple type
let x: [string, number];
// Initialize it
x = ["hello", 10];
// Access elements
console.log("First: " + x["0"] + " Second: " + x["1"]);

Production:

Premier: bonjour Deuxième: 10


10

Vous pouvez également envisager d'utiliser Record, comme ceci:

const someArray: Record<string, string>[] = [
    {'first': 'one'},
    {'second': 'two'}
];

Ou écrivez quelque chose comme ceci:

const someArray: {key: string, value: string}[] = [
    {key: 'first', value: 'one'},
    {key: 'second', value: 'two'}
];

9

un exemple de paire clé / valeur est:

[key: string]: string

vous pouvez mettre n'importe quoi comme valeur - si vous avez des valeurs renseignées par programme dont les types varient, vous pouvez mettre:

[key: string]: any

mais procédez à votre propre discrétion avec any:)


1
class Pair<T1, T2> {
    private key: T1;
    private value: T2;

    constructor(key: T1, value: T2) {
        this.key = key;
        this.value = value;
    }

    getKey() {
        return this.key;
    }

    getValue() {
        return this.value;
    }
}
const myPair = new Pair<string, number>('test', 123);
console.log(myPair.getKey(), myPair.getValue());

Ce n'est pas utile si vous essayez de taper des données provenant du backend.
— Mathijs Segers

@MathijsSegers Cette classe n'est pas censée être un type concret. Utilisez cette classe comme type dérivé dans votre type de béton
— GoldBishop

1

Une manière concise consiste à utiliser un tuple comme paire clé-valeur :

const keyVal: [string, string] =  ["key", "value"] // explicit type
// or
const keyVal2 = ["key", "value"] as const // inferred type with const assertion

[key, value] Les tuples garantissent également la compatibilité avec les objets intégrés JS:

Vous pouvez créer un générique KeyValuePair type pour la réutilisation:

type KeyValuePair<K extends string | number, V = unknown> = [K, V]
const kv: KeyValuePair<string, string> = ["key", "value"]

TS 4.0: tuples nommés

La prochaine TS 4.0 fournit des tuples nommés / étiquetés pour une meilleure documentation et un meilleur support d'outillage:

type KeyValuePairNamed = [key: string, value: string] // add `key` and `value` labels
const [key, val]: KeyValuePairNamed = ["key", "val"] // array destructuring for convenience

Exemple de terrain de travail

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.