¿El par clave-valor está disponible en TypeScript?


131

¿El par clave, valor está disponible en mecanografiado? Si es así, cómo hacerlo. ¿Alguien puede proporcionar ejemplos de enlaces de ejemplo?


sí lo es, ¿puede especificar su requisito?
— Taha Naqvi

mecanografiado se transpila (no compila) en javascript, por lo que todas las funciones de javascript están disponibles en mecanografiado. por ejemplo, si escribe su código en js y cambia su extensión a .ts, funcionará tan bien como su código js. Obtenga más información al respecto en: - typescriptlang.org/docs .
— Ajay

Respuestas:


176

¿El par clave-valor está disponible en TypeScript?

Si. Llamado una firma de índice :

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

Aquí están las claves stringy los valores Bar.

Más

Se puede utilizar un es6 Mappara los diccionarios adecuados, polyfilled porcore-js .


1
Este es un mapa o diccionario. Si desea algo equivalente a C # KeyValuePair, consulte answer stackoverflow.com/questions/36467469/…
— Jack Miller

4
También es bueno saberlo, no es necesario que lo llames key. Puede, por ejemplo, también escribir lo siguiente: [countryCode: string]: string. Agradable por la legibilidad.
— Jeff Huijsmans


131

La forma más sencilla sería 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
Esto ayudó mucho - Menos código que el enfoque de interfaz porque no requiere descripciónBar
— TheGeekZn

¿Tiene un ejemplo de uso de esto?
— trebor74

1
indexedArray = {}; indexedArray ["uno"] = 1; / * bueno * / indexedArray ["dos"] = "dos"; / fail * /
— Jaime

22

¿El par clave-valor está disponible en TypeScript?

Si piensa en un C # KeyValuePair <string, string> : No, pero puede definir uno fácilmente:

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

Uso:

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

4
Algo gracioso, ya son 6 votos con una suma de 0. ¿Les importaría a los votantes en contra agregar un comentario sobre lo malo de esta solución?
— Jack Miller

7
Yo también me gustaría saberlo. Los votantes en contra nunca dejan un comentario, a veces pienso porque ellos mismos no conocen una solución mejor.
— Ruan

No downvote pero esta solución no tiene complemento, obtener, quitar, etc.
— Danesh

2
@DaNeSh Eso es correcto. A KeyValuePairno es una lista, pero podría ser una entrada de una lista. ¿Quizás estás buscando un List<>? Ver stackoverflow.com/questions/23096260/…
— Jack Miller

¿Cómo usar la clave para obtener el valor? es como: keyValuePair ["k"]?
— Heisenberg

15

No para el interrogador, sino para todos los demás interesados: ver: Cómo definir el mapa de TypeScript del par clave-valor. donde la clave es un número y el valor es una matriz de objetos

Por tanto, la solución es:

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

¡Salud!


¿Dónde se Mapdefine? ¿Es específico de Angular?
— Jack Miller


1
yourVar [YourKeyType] = XXX. Esto no establece un elemento en el mapa. Establece una propiedad.
— mcoolive

El navegador IE no es compatible con Map, ¿alguna alternativa?
— Rahul Upadhyay

12

Otra forma sencilla es utilizar una tupla :

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

Salida:

Primero: hola Segundo: 10


10

También puede considerar usar Record, así:

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

O escribe algo como esto:

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

9

un ejemplo de un par clave-valor es:

[key: string]: string

puede poner cualquier cosa como valor; si ha completado programáticamente valores cuyos tipos varían, puede poner:

[key: string]: any

aunque proceda a su propia discreción con 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());

Esto no es útil si está intentando escribir datos provenientes del backend.
— Mathijs Segers

@MathijsSegers Esta clase no está destinada a ser un tipo concreto. Utilice esta clase como un tipo derivado en su tipo concreto
— GoldBishop

1

Una forma concisa es usar una tupla como par clave-valor :

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

[key, value] Las tuplas también garantizan la compatibilidad con los objetos integrados de JS:

Puede crear un KeyValuePairtipo genérico para su reutilización:

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

TS 4.0: tuplas con nombre

El próximo TS 4.0 proporciona tuplas con nombre / etiqueta para una mejor documentación y soporte de herramientas:

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

Ejemplo de patio de juegos de trabajo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.