Czy para klucz-wartość jest dostępna w Typescript?


132

Czy para klucz, wartość jest dostępna w maszynie? Jeśli tak, jak to zrobić. Czy ktoś może podać przykładowe przykładowe linki.


tak, czy możesz określić swoje wymagania?
— Taha Naqvi

maszynopis transpiles (nie kompiluje się) do javascript, więc wszystkie funkcje javascript są dostępne w maszynie. np. jeśli napiszesz swój kod w js i zmienisz jego rozszerzenie na .ts, będzie działał tak dobrze, jak twój kod js. dowiedz się więcej na ten temat na: - typescriptlang.org/docs .
— Ajay,

Odpowiedzi:


176

Czy para klucz-wartość jest dostępna w Typescript?

Tak. Nazwany podpisem indeksu :

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

Tutaj są klucze stringi wartości Bar.

Więcej

Możesz użyć es6 Mapdla odpowiednich słowników, wypełnionych przezcore-js .


1
To jest mapa lub słownik. Jeśli chcesz czegoś równoważnego C # KeyValuePair, zobacz odpowiedź stackoverflow.com/questions/36467469/ ...
— Jack Miller

4
Miło też wiedzieć, nie musisz tego nazywać key. Można, na przykład, również napisać to: [countryCode: string]: string. Niezłe dla czytelności.
— Jeff Huijsmans,


131

Najprościej byłoby coś takiego:

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

Stosowanie:

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

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

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

3
To bardzo pomogło - mniej kodu niż podejście interfejsu, ponieważ nie wymaga opisywaniaBar
— TheGeekZn

Czy masz przykładowe użycie tego?
— trebor74

1
indexedArray = {}; indexedArray ["one"] = 1; / * good * / indexedArray ["two"] = "two"; / fail * /
— Jaime

23

Czy para klucz-wartość jest dostępna w Typescript?

Jeśli myślisz o C # KeyValuePair <string, string> : Nie, ale możesz łatwo zdefiniować go samodzielnie:

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

Stosowanie:

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

4
Dość zabawne, już 6 głosów z sumą 0. Czy osoby osłabiające miałyby coś przeciwko dodaniu komentarza, co jest złego w tym rozwiązaniu?
— Jack Miller,

7
Ja też chciałbym wiedzieć. Głosujący w dół nigdy nie zostawiają komentarza, czasem myślę, bo sami nie znają lepszego rozwiązania.
— Ruan,

Nie głosowałem przeciw, ale to rozwiązanie nie ma dodawania, pobierania, usuwania itp.
— DaNeSh

2
@DaNeSh Zgadza się. A KeyValuePairnie jest listą, ale może to być wpis na liście. Może szukasz List<>? Zobacz stackoverflow.com/questions/23096260/…
— Jack Miller

Jak użyć klucza, aby uzyskać wartość? czy wygląda to tak: keyValuePair ["k"]?
— Heisenberg

15

Nie dla pytającego, ale dla wszystkich innych zainteresowanych: Zobacz: Jak zdefiniować mapę maszynopisu pary klucz-wartość. gdzie klucz to liczba, a wartość to tablica obiektów

Rozwiązaniem jest zatem:

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

Twoje zdrowie!


Gdzie jest Mapzdefiniowane? Czy jest to specyficzne dla Angulara?
— Jack Miller

1
@JackMiller mapa jest zdefiniowany przez ES6: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
— Randolpho

1
yourVar [YourKeyType] = XXX. Nie powoduje to ustawienia elementu w Mapie. Ustawia właściwość.
— mcoolive

Przeglądarka IE nie obsługuje Map, jest jakaś alternatywa?
— Rahul Upadhyay

12

Innym prostym sposobem jest użycie krotki :

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

Wynik:

Po pierwsze: cześć Po drugie: 10


10

Możesz również rozważyć użycie w Recordten sposób:

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

Lub napisz coś takiego:

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

9

Przykładem pary klucz-wartość jest:

[key: string]: string

możesz wpisać cokolwiek jako wartość - jeśli masz programowo wypełnione wartości, których typy się różnią, możesz umieścić:

[key: string]: any

chociaż kontynuuj według własnego uznania 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());

Nie jest to pomocne, jeśli próbujesz wpisać dane pochodzące z zaplecza.
— Mathijs Segers

@MathijsSegers Ta klasa nie jest przeznaczona do konkretnego typu. Użyj tej klasy jako typu pochodnego do swojego konkretnego typu
— GoldBishop

1

Zwięzłym sposobem jest użycie krotki jako pary klucz-wartość :

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

[key, value] krotki zapewniają również zgodność z obiektami wbudowanymi JS:

Możesz utworzyć KeyValuePairtyp ogólny do ponownego wykorzystania:

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

TS 4.0: Nazwane krotki

Nadchodzący TS 4.0 zapewnia nazwane / oznakowane krotki dla lepszej dokumentacji i obsługi narzędzi:

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

Przykład działającego placu zabaw

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.