Menu

TypeScript Map: Map<K, V>, get, set, has ve Döngü

TypeScript'te Map nasıl kullanılır: tipli bir Map<K, V> oluşturmak, get metodunun neden V | undefined döndürdüğü, set, has ve delete, ekleme sırasıyla döngü, nesne anahtarları, nesnelere ve JSON'a dönüştürme, Map, nesne ve Record karşılaştırması ve array.map() tiplemesi.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

TypeScript Map, anahtarları ve değerleri tiplenmiş yerleşik JavaScript Map yapısıdır: Map<string, number> string'leri number'lara eşler. new Map<K, V>() ile bir tane oluşturun, sonra set, get, has ve delete kullanın. get, anahtar eksik olabileceği için V | undefined döndürür.

Bir Map'i TypeScript'te işe yarar kılan tip argümanlarıdır: her set kontrol edilir ve her get değer tipini döndürür. Son satır bir derleme hatasıdır (TS2345); @ts-expect-error bloğun çalışmaya devam etmesini sağlar.

Bu sayfa Map koleksiyonu hakkındadır. array.map() arıyorsanız, son bölümde ele alınıyor.

Map Oluşturmak

Tipler tip argümanlarından, başlangıç girdilerinden ya da bir notasyondan gelir. Başlangıç girdileri [key, value] tuple'larından oluşan bir dizi ya da bunları üreten başka herhangi bir şeydir.

İki çıkarım tuzağı:

  • Tip argümanı ve girdisi olmayan new Map(), Map<any, any> tipindedir. İçine koyduğunuz ya da içinden aldığınız hiçbir şey kontrol edilmez. Her zaman new Map<K, V>() yazın.
  • Farklı değer tiplerine sahip girdiler bir union çıkarmaz. new Map([["a", 1], ["b", "x"]]) TS2769 hatasıdır (No overload matches this call). Tipi yazın: new Map<string, number | string>([...]).

get V | undefined Döndürür

Bir Map bir anahtarın var olduğunu garanti edemez, bu yüzden get metodu V | undefined olarak tiplenir. strict altında değeri bir V olarak kullanmadan önce undefined durumunu ele almalısınız:

index.ts(4,7): error TS2322: Type 'number | undefined' is not assignable to type 'number'.
  Type 'undefined' is not assignable to type 'number'.

En yaygından en az yaygına çözümler:

TypeScript, sonradan get çağırdığınızda has metodunun true döndürdüğünü hatırlamaz. get sonucunu doğrudan kontrol etmek hem daha kısa hem de güvenlidir. Bir non-null assertion, stock.get("apples")!, hatayı susturur ama anahtar eksikse hiçbir koruma sağlamaz.

Map Metotları ve Tipleri

ÜyeMap<K, V> üzerindeki tipiNotlar
new Map<K, V>(entries?)Map<K, V>entries: [K, V] iterable'ı
set(key, value)thisEkler ya da değiştirir; zincirlenebilir
get(key)V | undefinedEksikse undefined
has(key)boolean
delete(key)booleanBir şey silindiyse true
clear()voidHer şeyi siler
sizenumberBir özelliktir, metot değil
keys(), values()K, V iterator'larıBir diziye yayın: [...map.keys()]
entries(), for...of[K, V] iterator'ıEkleme sırası
forEach((value, key) => ...)voidDikkat: önce value gelir

Bir Map Üzerinde Döngü

Bir Map ekleme sırasıyla dolaşılır. Map üzerindeki for...of, [K, V] olarak tiplenmiş [key, value] tuple'ları üretir.

Var olan bir anahtarı set etmek değeri günceller ama anahtarın sıradaki orijinal konumunu korur.

Nesne Anahtarları ve Sayma

Nesneler ve diziler dahil her değer bir anahtar olabilir. Anahtarlar === gibi karşılaştırılır: aynı içeriğe sahip iki nesne farklı anahtarlardır. Bir Map ayrıca öğeleri saymanın ya da gruplamanın standart yoludur.

Bir nesnenin içeriğine göre anahtar kullanmak için bunun yerine user.id ya da `${x},${y}` gibi bir string ya da number anahtar türetin.

Map, Nesne ve Record

Map<K, V>Nesne / Record<string, V>
Anahtar tipleriher şey, === gibi karşılaştırılırstring (number'lar string olur), symbol
Eksik anahtar tipiget, V | undefined döndürürnoUncheckedIndexedAccess açık değilse obj[key] tipi V olur
Sıraekleme sırasıçoğunlukla ekleme sırası, ama tam sayı benzeri anahtarlar artan sırada önce gelir
Boyutmap.sizeObject.keys(obj).length
Sık ekleme ve silmebunun için optimize edilmiştirbunun için optimize edilmemiştir
JSONdoğrudan değil (JSON.stringify(map) sonucu "{}")doğrudan
Literal sözdizimi, destructuringhayırevet
Yanlışlıkla miras alınan anahtarlaryok"toString" in {} sonucu true

Pratik kural: anahtarları veri olan (kullanıcı id'leri, kelimeler, önbellek girdileri) ve çalışma zamanında değişen bir koleksiyon için Map; bilinen sabit bir anahtar kümesi ve JSON'a giden ya da JSON'dan gelen her şey için bir nesne tipi ya da Record kullanın. dictionary sayfası string anahtarlı aramalar için index signature'ları, Record ve Map yapısını karşılaştırır.

Map'leri Nesnelere ve JSON'a Dönüştürmek

Bir Map yapısının girdileri özellik değildir, bu yüzden JSON.stringify onları görmez. Object.fromEntries ve Object.entries üzerinden dönüştürün:

JSON.parse any döndürür, bu yüzden as Record<...> verinin ne olması beklendiğini belirtir. Bu bir çalışma zamanı kontrolü değildir; güvenilmeyen JSON'u bu tipe güvenmeden önce doğrulayın.

array.map() Tiplemesi

"typescript map" aramalarının çoğu, her elemanı dönüştürüp yeni bir dizi döndüren dizi metodunu kasteder. Tipi callback'ten çıkarılır, bu yüzden notasyon nadiren gerekir:

Callback'in dönüş tipine notasyon yazmak ((u): Option => ...), sonuç tipini belirtmenin en açık yoludur: döndürülen nesnedeki eksik ya da yanlış yazılmış bir özellik o zaman callback'te bir derleme hatası olur.

Sıkça Sorulan Sorular

TypeScript'te Map nasıl oluşturulur?

Anahtar ve değer tiplerini constructor'a geçirin: const ages = new Map<string, number>(). Başlangıç girdileriyle tipler çıkarılır: new Map([["ada", 36]]) bir Map<string, number> olur. Tipi ve girdisi olmayan çıplak bir new Map() ise kontrolü kapatan Map<any, any> tipindedir; bu yüzden ona her zaman tip verin.

TypeScript'te Map.get neden undefined döndürüyor?

map.get(key), anahtar orada olmayabileceği için V | undefined olarak tiplenir. TypeScript önceki bir map.has(key) çağrısını sonraki bir get ile ilişkilendirmez; bu yüzden has sonrasında bile undefined durumunu ele almanız gerekir: sonucu saklayıp kontrol edin ya da ?? ile bir varsayılan kullanın.

TypeScript'te Map ile nesne arasındaki fark nedir?

Bir Map her tipte anahtarı (nesneler dahil) kabul eder, ekleme sırasını korur, bir size özelliğine sahiptir ve sık ekleme ve silme için tasarlanmıştır. Düz bir nesne ya da Record<string, V> yalnızca string (ve symbol) anahtarlara sahiptir, doğrudan JSON'a dönüştürülür ve literal sözdizimi ile destructuring destekler. Dinamik anahtarlı koleksiyonlar için Map, sabit şekiller ve JSON verisi için nesne kullanın.

TypeScript'te bir Map'i nesneye ya da JSON'a nasıl dönüştürürüm?

Object.fromEntries(map), bir Map<string, V> değerini düz bir nesneye çevirir; JSON.stringify de ardından onu serileştirebilir. Map'in kendisi üzerinde JSON.stringify(map) çağrısı "{}" verir, çünkü bir Map'in girdileri özellik değildir. Tersi new Map(Object.entries(obj)) şeklindedir.

TypeScript'te array.map callback'ini nasıl tiplerim?

Genellikle gerek yoktur: items.map((item) => item.name), item tipini diziden, sonuç tipini de callback'in döndürdüğü şeyden çıkarır. Bir sonuç tipini zorlamak için onu tip argümanı olarak geçirin, items.map<string>(...), ya da callback'in dönüş tipine notasyon yazın.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA