Чи доступна пара ключ-значення в Typescript?


130

Чи доступний ключ, пара значень у typecript? Якщо так, як це зробити. Хто-небудь може надати зразок прикладних посилань.


так, це може, ви можете вказати свою вимогу?
— Taha Naqvi

Транспілює машинопис (не компілює) у javascript, тому вся функція javascript доступна в typecript. Наприклад, якщо ви пишете свій код у js та змінюєте його розширення на .ts, він буде працювати так само добре, як і ваш js-код. Дізнайтеся більше про це на: - typecriptlang.org/docs .
— Аджай

Відповіді:


175

Чи доступна пара ключ-значення в Typescript?

Так. Викликається підпис індексу :

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

Тут ключі є stringі значення є Bar.

Більше

Ви можете використовувати ES6 Mapдля власних словників, polyfilled поcore-js .


1
Це карта чи словник. Якщо ви хочете щось еквівалентне C # KeyValuePair, дивіться відповідь stackoverflow.com/questions/36467469/…
— Джек Міллер

4
Також приємно знати, що вам не потрібно це називати key. Ви можете, наприклад, записати його: [countryCode: string]: string. Приємно для читабельності.
— Джефф Хуйсманс

1
Це оновлене посилання: basarat.gitbook.io/typescript/type-system/index-signatures
— BornToCode

130

Найпростішим способом було б щось на зразок:

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

Використання:

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

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

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

3
Це дуже допомогло - Менше коду, ніж інтерфейсний підхід, тому що він не потребує описуBar
— TheGeekZn

У вас є приклад використання цього?
— trebor74

1
indexedArray = {}; indexedArray ["one"] = 1; / * good * / indexedArray ["два"] = "два"; / не вдається * /
— Хайме

22

Чи доступна пара ключ-значення в Typescript?

Якщо ви думаєте про C # KeyValuePair <string, string> : Ні, але ви можете легко визначити його самостійно:

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

Використання:

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

4
Дещо смішно, вже 6 голосів із сумою 0. Чи не заперечують люди, котрі додають коментар, що поганого в цьому рішенні?
— Джек Міллер

7
Я теж хотів би знати. Вниз виборці ніколи не залишають коментарів, я іноді думаю, тому що вони самі не знають кращого рішення.
— Руан

Я не заявив, але це рішення не має додавати, отримувати, видаляти тощо
— DaNeSh

2
@DaNeSh Правильно. A KeyValuePair- це не список, але це може бути запис списку. Можливо, ви шукаєте List<>? Дивіться stackoverflow.com/questions/23096260/…
— Джек Міллер

Як за допомогою ключа отримати значення? це як: keyValuePair ["k"]?
— Гейзенберг

15

Не для запитувача, а для всіх інших, хто зацікавлений: Див.: Як визначити карту Typescript для пари ключових значень. де ключ - це число, а значення - це масив об'єктів

Отже, рішення:

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

Ура!


Де Mapвизначено? Це кутово-специфічний?
— Джек Міллер

1
Карта @JackMiller визначена ES6: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
— Randolpho

1
yourVar [YourKeyType] = XXX. Це не встановлює елемент на карті. Він встановлює властивість.
— mcoolive

IE-браузер не підтримує Map, будь-яку альтернативу?
— Рахул Упадхей,

12

Ще один простий спосіб - використовувати кортеж :

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

Вихід:

Перше: привіт Друге: 10


10

Ви також можете розглянути таке використання Record:

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

Або напишіть щось подібне:

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

9

Приклад пари ключових значень:

[key: string]: string

ви можете поставити що-небудь як значення - якщо у вас є програмно заповнені значення, типи яких різняться, ви можете поставити:

[key: string]: any

хоча продовжуйте на власний розсуд 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());

Це не допоможе, якщо ви намагаєтеся ввести дані, що надходять із бекенда.
— Mathijs Segers

@MathijsSegers Цей клас не призначений для конкретного типу. Використовуйте цей клас як похідний тип для свого конкретного типу
— GoldBishop

1

Короткий спосіб - використовувати кортеж як пару ключових значень :

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

[key, value] кортежі також забезпечують сумісність із вбудованими об'єктами JS:

Ви можете створити загальний KeyValuePairтип для повторного використання:

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

TS 4.0: Названі кортежі

Майбутній TS 4.0 надає названі / марковані кортежі для кращої підтримки документації та інструментарію:

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

Приклад робочого майданчика

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.