Anahtar / değer çifti Typescript'te mevcut mu?


132

Anahtar, değer çifti typcript'te mevcut mu? Cevabınız evet ise nasıl yapılır. Herkes örnek örnek bağlantılar sağlayabilir.


evet öyle, ihtiyacınızı belirtebilir misiniz?
Taha Naqvi

typescript transpiles (derlenmez) javascript içine, bu yüzden javascript'in tüm özellikleri typcript'te mevcuttur. Örneğin, kodunuzu js olarak yazıp uzantısını .ts olarak değiştirirseniz, js kodunuz kadar iyi çalışacaktır. bununla ilgili daha fazla bilgi edinin: - typescriptlang.org/docs .
Ajay

Yanıtlar:


176

Anahtar / değer çifti Typescript'te mevcut mu?

Evet. Bir dizin imzası olarak adlandırıldı :

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

İşte anahtarlar stringve değerler Bar.

Daha

Bir ES6 kullanabilirsiniz Mapuygun sözlüklerde için tarafından polyfilledcore-js .


1
Bu bir harita veya sözlüktür. Bir C # KeyValuePair'e eşdeğer bir şey istiyorsanız, cevaba bakın stackoverflow.com/questions/36467469/…
Jack Miller

4
Bilmek de güzel, aramana gerek yok key. Sen, mesela, aynı zamanda bu yazabilirsiniz: [countryCode: string]: string. Okunabilirlik için güzel.
Jeff Huijsmans


131

En basit yol şöyle bir şey olabilir:

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

Kullanımı:

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

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

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

3
Bu çok yardımcı oldu - Arayüz yaklaşımından daha az kod, çünkü açıklama gerektirmiyorBar
TheGeekZn

Bunun bir örnek kullanımınız var mı?
trebor74

1
indexedArray = {}; indexedArray ["bir"] = 1; / * iyi * / indexedArray ["iki"] = "iki"; / başarısız * /
Jaime,

23

Anahtar / değer çifti Typescript'te mevcut mu?

Bir C # KeyValuePair <string, string> düşünürseniz : Hayır, ancak kendiniz kolayca bir tane tanımlayabilirsiniz:

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

Kullanımı:

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

4
Biraz komik, şimdiden 6 oyla 0 oy aldı. Olumsuz oy verenler bir yorum eklemeyi düşünürler mi bu çözümle ilgili kötü olan nedir?
Jack Miller

7
Ben de bilmek isterim. Aşağı seçmenler asla yorum bırakmaz, bazen kendilerinin daha iyi bir çözüm bilmediklerini düşünüyorum.
Ruan

Olumsuz oy vermedim ama bu çözümde ekleme, alma, kaldırma vb.
Yok

2
@DaNeSh Doğru. A KeyValuePairbir liste değildir, ancak bir liste girişi olabilir. Belki bir List<>arıyorsunuz? Stackoverflow.com/questions/23096260/… sayfasına
Jack Miller

Değeri elde etmek için anahtar nasıl kullanılır? şöyle mi: keyValuePair ["k"]?
Heisenberg

15

Soru soran için değil, ilgilenen diğerleri için: Bkz: Anahtar-değer çiftinin Typescript Haritası nasıl tanımlanır. burada anahtar bir sayıdır ve değer bir nesneler dizisidir

Çözüm bu nedenle:

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

Şerefe!


Nerede Maptanımlanır? Açısal özel mi?
Jack Miller

1
@JackMiller Haritası, ES6 tarafından tanımlanmıştır: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Randolpho

1
yourVar [YourKeyType] = XXX. Bu, Harita'da bir öğe belirlemez. Bir özellik belirler.
mcoolive

IE tarayıcısı Harita'yı desteklemiyor, herhangi bir alternatif var mı?
Rahul Upadhyay

12

Diğer bir basit yol, bir demet kullanmaktır :

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

Çıktı:

İlk: merhaba İkinci: 10


10

Ayrıca şu şekilde kullanmayı da düşünebilirsiniz Record:

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

Veya bunun gibi bir şey yazın:

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

9

anahtar-değer çifti örneği:

[key: string]: string

değer olarak herhangi bir şey koyabilirsiniz - türleri değişen, programlı olarak doldurulmuş değerleriniz varsa, şunu koyabilirsiniz:

[key: string]: any

yine de kendi takdirinize göre devam edin 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());

Arka uçtan gelen verileri yazmaya çalışıyorsanız, bu yardımcı olmaz.
Mathijs Segers

@MathijsSegers Bu sınıfın somut bir tür olması amaçlanmamıştır. Bu sınıfı beton
türünüzde

1

Kısa bir yol, bir demeti anahtar / değer çifti olarak kullanmaktır :

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

[key, value] demetler ayrıca JS yerleşik nesnelerine uyumluluk sağlar:

Yeniden KeyValuePairkullanılabilirlik için genel bir tür oluşturabilirsiniz :

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

TS 4.0: Adlandırılmış demetler

Yaklaşan TS 4.0, daha iyi dokümantasyon ve takım desteği için adlandırılmış / etiketlenmiş demetler sağlar:

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

Çalışma alanı örneği

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.