TypeScriptのRecord型を、自分のキーで理解する

TypeScriptのRecord型

TypeScriptのRecord<K, V>:型付きの参照用オブジェクトを解説 | We.Inc

自分のキーからRecord<K, V>型を作り、それが表すオブジェクトを確認できます。Recordがインデックスシグネチャやマップより適している場面と、検出できるエラーを解説します。

Record<K, V>は組み込みのユーティリティ型で、キーがKから取られ、値がすべてV型であるオブジェクトを表します。文字列リテラルのユニオンを渡すと、コンパイラーは列挙したすべてのキーが存在することを要求します。単なるstringを渡すと、インデックスシグネチャと同じく、開いた辞書のように振る舞います。

Recordの概要

使いたいキーを入力し、値の型を選んでください。ビルダーがRecord型、それが展開される通常のオブジェクト型、キーごとに1行ずつの雛形オブジェクトを書き出します。コードに貼り付ける前に、コンパイラーが何を求めるのかを正確に確認できます。

よくある質問

Recordはインデックスシグネチャと同じですか?

stringのような広いキーなら同じです。Record<string, number>と{ [key: string]: number }は同じ形を表します。違いが出るのはリテラルのキーです。インデックスシグネチャは特定の名前の存在を要求できませんが、Record<"a" | "b", number>はaとbの両方を必須にします。

RecordではなくMapを使うべきなのはどんなときですか?

キーの追加と削除が頻繁なとき、キーが文字列でないとき、sizeで件数が必要なときはMapを使いましょう。決まった名前の集合、設定オブジェクト、JSON.stringifyに通すものにはRecordを使います。

Recordにプロパティがないと TypeScript に言われるのはなぜですか?

キーの型がユニオンで、オブジェクトがその一部を欠いているからです。tscは、たとえばProperty 'about' is missing in type '{ home: string; }'と報告します。キーを追加するか、省略が正しいならPartialで型を囲みましょう。

Recordは実行時にも存在しますか?

いいえ。型だけの存在で、コンパイル時に消えます。作成したオブジェクトは普通のJavaScriptオブジェクトなので、サーバーのレスポンスにキーが余分にあったり欠けていたりしても、コンパイラーは防げません。

RecordはどのTypeScriptバージョンで追加されましたか?

RecordはPartial、Readonly、Pickとともに TypeScript 2.1 で登場したため、現行のどのコンパイラーにもあります。

Recordの仕組み

閉じたキーと開いたキー

Record、インデックスシグネチャ、Map

よく使うパターン

as const配列からキーを作る

配列が唯一の情報源になります。ステータスを追加すると、ラベルも追加するまでコンパイラーがラベル表を指摘します。

別の型のフィールドごとに1つのフラグ

keyofで既存の型をキーのユニオンに変えるため、フォームのtouched状態のオブジェクトは常にフォームと同じフィールドを列挙します。

開いた辞書を安全に読む

noUncheckedIndexedAccessを有効にすると、計算されたキーでの読み取りはnumber | undefinedになるため、フォールバックを忘れずに書くことになります。

Record型ビルダー

キー(カンマ区切り)

値の型

キーを省略可能にする(Partialで囲む)

型

展開後の型

雛形オブジェクト

キーを1つ以上入力してください。キーは英字、_、$のいずれかで始める必要があります。

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

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

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る