TypeScriptのMap:型付きのキーと値のコレクション

TypeScriptのMap

TypeScriptのMap:型付け、反復処理、保存 | We.Inc

TypeScriptでMap<K, V>に型を付け、ループし、JSONに変換して元に戻し、Map、Record、普通のオブジェクトのどれを使うかを判断しましょう。ブラウザーで動くMapも試せます。

TypeScriptのMapは、キーと値に型を付けた普通のJavaScriptのMapで、new Map<string, number>() のように書きます。キーにはどんな値でも使え、エントリーは最初に追加された順に返り、sizeでその数がわかり、getは V | undefined を返します。JSON.stringifyはMapをシリアライズしないので、先に変換しましょう。

Mapのメソッドと、TypeScriptが返す型

下のプレイグラウンドは、ブラウザーで実際に動いているMapです。エントリーを追加、更新、削除しながら、3つの点に注目しましょう。エントリーが保つ順序、sizeが報告する値、そしてMapそのものを文字列化した場合と、変換したコピーを文字列化した場合の違いです。

よくある質問

TypeScriptでMapの型を宣言するには?

キーと値の型をジェネリクスの引数として渡します:const prices = new Map<string, number>()。フィールドや引数では型を Map<string, number> と書き、関数が読み取るだけなら ReadonlyMap<string, number> と書きます。

map.get() の型にundefinedが含まれるのはなぜですか?

ある時点でMapにどのキーが入っているかを、コンパイラーは知ることができないからです。getは V | undefined と型付けされているので、値をVとして扱う前に、if文のチェック、?? による代替値、has() による確認で絞り込みます。

JSON.stringify(map) が {} になるのはなぜですか?

Mapはエントリーをオブジェクトのプロパティではなく内部スロットに保持しているため、JSONからは空のオブジェクトに見えます。先に変換しましょう。キーが文字列ならObject.fromEntries(map)、どんな型のキーでも保てるペアの配列なら [...map] です。

MapとRecordのどちらを使うべきですか?

名前の決まった固定のキーの集まりや、JSONとやり取りするデータにはRecordを使いましょう。アプリの実行中にエントリーが増えたり減ったりする場合、キーが数値やオブジェクトの場合、挿入順が重要な場合はMapを使いましょう。

キーを更新すると末尾に移動しますか?

いいえ。既存のキーにセットすると値は変わりますが、元の位置は保たれます。末尾に移動したい場合は、キーを削除してからもう一度セットします。

Map、Record、普通のオブジェクト

キーの一致の仕組み

関数のシグネチャでMapに型を付ける

型付きMapのレシピ

Mapで単語を数える

?? による代替値が、単語が初めて出てきた場合を処理します。だからこそ、getが number | undefined を返すのは煩わしいどころか役に立つのです。

MapをJSONとして保存し、読み込み直す

ペアの配列なら、すべてのエントリーとその順序が保たれます。すべてのキーが文字列なら、Object.fromEntriesが読みやすい選択です。

読み取り専用のMapを受け取る

total関数の中でprices.setを呼ぶとコンパイルエラーになるので、呼び出し側は防御的なコピーを作らずにMapを渡せます。

Mapのライブプレイグラウンド

キー

値(数値)

セット

削除

クリア

リセット

反復順のエントリー

Mapは空です。

size: {n}

"{v}" を追加しました。

"{v}" を削除しました。

"{v}" はMapにないため、deleteはfalseを返しました。

先にキーを入力してください。

値は数値でなければなりません。

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る