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


132

Доступна ли пара ключ-значение в машинописном тексте? Если да, то как это сделать. Может ли кто-нибудь предоставить образцы ссылок.


да, можете уточнить ваши требования?
— Таха Накви,

машинописный текст транслируется (не компилируется) в javascript, поэтому все функции javascript доступны в машинописном тексте. например, если вы напишете свой код на js и измените его расширение на .ts, он будет работать так же хорошо, как ваш код js. узнать больше об этом: - typescriptlang.org/docs .
— Аджай

Ответы:


177

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

Да. Вызывается индексной подписью :

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

Вот ключи stringи значения Bar.

Больше

Вы можете использовать es6 Mapдля правильных словарей, заполненныхcore-js .


1
Это карта или словарь. Если вам нужно что-то эквивалентное C # KeyValuePair, см. Ответ stackoverflow.com/questions/36467469/…
— Джек Миллер,

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

1
Это обновленная ссылка: basarat.gitbook.io/typescript/type-system/index-signatures
— BornToCode

131

Самый простой способ:

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 ["один"] = 1; / * хорошо * / indexedArray ["два"] = "два"; / fails * /
— Хайме

23

Доступна ли пара ключ-значение в 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

Не для спрашивающего, а для всех остальных, кого это интересует: См .: Как определить Типографскую карту пары ключ-значение. где ключ - это число, а значение - это массив объектов

Поэтому решение:

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

Ура!


Где Mapопределяется? Это специфично для Angular?
— Джек Миллер

1
@JackMiller Map определяется ES6: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
— Randolpho,

1
yourVar [YourKeyType] = XXX. Это не устанавливает элемент на карте. Он устанавливает свойство.
— mcoolive 07

Браузер IE не поддерживает карту, есть ли альтернатива?
— Рахул Упадхьяй

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.