O par de valores-chave está disponível em Typescript?


130

A chave, o par de valor está disponível no texto datilografado? Se sim, como fazer isso. Alguém pode fornecer exemplos de links.


sim é, você pode especificar seus requisitos?
Taha Naqvi,

transpila typescript (não compila) em javascript, de modo que todos os recursos do javascript estão disponíveis em typescript. por exemplo, se você escrever seu código em js e alterar sua extensão para .ts, ele funcionará tão bem quanto seu código js. aprenda mais sobre isso em: - typescriptlang.org/docs .
Ajay,

Respostas:


172

O par de valores-chave está disponível em Typescript?

Sim. Chamado de assinatura de índice :

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

Aqui estão as chaves stringe os valores Bar.

Mais

Você pode usar um es6 Mappara dicionários adequados, polyfilled porcore-js .


1
Este é um mapa ou dicionário. Se você quiser algo equivalente a um C # KeyValuePair, consulte a resposta stackoverflow.com/questions/36467469/…
Jack Miller

4
Também é bom saber, você não precisa ligar key. Você pode, por exemplo, também escrever este: [countryCode: string]: string. Bom para legibilidade.
Jeff Huijsmans


130

A maneira mais simples seria algo como:

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

Uso:

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

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

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

3
Isso ajudou muito - Menos código do que a abordagem da interface porque não requer descriçãoBar
TheGeekZn

Você tem um exemplo de uso disso?
trebor74

1
indexedArray = {}; indexedArray ["um"] = 1; / * bom * / indexedArray ["dois"] = "dois"; / fail * /
Jaime

22

O par de valores-chave está disponível em Typescript?

Se você pensar em um C # KeyValuePair <string, string> : Não, mas você mesmo pode definir um facilmente:

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

Uso:

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

4
Um pouco engraçado, já 6 votos com uma soma de 0. Será que os downvoters se importariam em adicionar um comentário sobre o que há de ruim nessa solução?
Jack Miller

7
Eu também gostaria de saber. Os eleitores em baixa nunca deixam um comentário, às vezes penso porque eles próprios não conhecem nenhuma solução melhor.
Ruan

Não fiz downvote, mas esta solução não tem add, get, remove, etc.
DaNeSh

2
@DaNeSh Isso mesmo. A KeyValuePairnão é uma lista, mas pode ser uma entrada de uma lista. Talvez você esteja procurando um List<>? Consulte stackoverflow.com/questions/23096260/…
Jack Miller

Como usar a chave para obter o valor? é como: keyValuePair ["k"]?
Heisenberg

15

Não para o questionador, mas para todos os outros interessados: Veja: Como definir o Mapa Typescript do par de valores-chave. onde a chave é um número e o valor é uma matriz de objetos

A solução é, portanto:

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

Felicidades!


Onde está Mapdefinido? É específico do ângulo?
Jack Miller


1
yourVar [YourKeyType] = XXX. Isso não define um elemento no mapa. Ele define uma propriedade.
mcoolive

O navegador IE não suporta Map, alguma alternativa?
Rahul Upadhyay

12

Outra maneira simples é usar uma tupla :

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

Resultado:

Primeiro: Olá, Segundo: 10


10

Você também pode considerar o uso Record, como este:

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

Ou escreva algo assim:

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

9

um exemplo de par de valores-chave é:

[key: string]: string

você pode colocar qualquer coisa como o valor - se você tiver valores populados programaticamente cujos tipos variam, você pode colocar:

[key: string]: any

embora proceda a seu próprio critério com 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());

Isso não será útil se você estiver tentando digitar dados vindos do back-end.
Mathijs Segers de

@MathijsSegers Esta classe não pretende ser um tipo concreto. Use esta classe como um tipo derivado em seu tipo concreto
GoldBishop

1

Uma maneira concisa é usar uma tupla como par de valores-chave :

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

[key, value] tuplas também garantem compatibilidade com objetos JS incorporados:

Você pode criar um genérico KeyValuePair tipo para reutilização:

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

TS 4.0: tuplas nomeadas

O próximo TS 4.0 fornece tuplas nomeadas / rotuladas para melhor documentação e suporte de ferramentas:

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

Exemplo de playground de trabalho

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.