TypeScriptの指定したキーを元に、Map
みたいな型を生成するRecord
というものがある。
今回はこれを自力で実装しながらRecord
について理解することを目的とする。
Recordとは
Record
とは以下の書式を持つ組み込み型で、K
に指定したキーに対して、型T
を設定してくれるものです。
// Record<K extends string | number | symbol, T> Kに指定された型をキーにして,それぞれに対して、型Tを設定する。
type User = {
id: number;
name: String;
};
const Users:Record<1 | 2 , User> = {
1 : {
id: 1,
name: "user1"
},
2 : {
id: 2,
name: "user2"
},
};
今回はこれを実装して理解していきます。
すなわち以下のMyRecord
を実装していきます。
type User = {
id: number;
name: String;
};
const Users:MyRecord<1 | 2 , User> = {
1 : {
id: 1,
name: "user1"
},
2 : {
id: 2,
name: "user2"
},
};
MyRecordの実装方針
MyRecord
を実装するにあたって、以下の方針で段階を踏んで実装していきます。
MyRecord<K extends string | number | symbol, T>
のK
で指定されたプロパティのキーを羅列する- それぞれのキーに対して、Tの型を設定する
では順に見ていきましょう
MyRecord<K extends string | number | symbol, T>に指定されたキーを羅列する
これはMapped Types
を使えば簡単に羅列できます。
type MyRecord<K extends string | number, T> = {
[P in K]: any;
};
上記の[P in K]
については見慣れない人も多いかもしれませんが、これだけで、Kに指定されたキーの全てをPとして羅列することが可能です。
それぞれに対して、any
を設定していますので、これをT
に変換するだけで出来そうですね。
それぞれのプロパティのキーに対して、Tの型を設定する。
これは先程の例に対してTを指定するだけなので、以下のとおりとすることで可能です。
type MyRecord<K extends string | number, T> = {
[P in K]: T;
};
まとめ
今回はRecord
の実装を順を追って実装していきました。
理解出来ましたでしょうか?Mapped Types
の概念は理解するまでとっつきにくいので、慣れるまで繰り返し使うしか無いですね!
今回のように、少しむずかしい問題に遭遇したら内容を分解して順序立てて理解していくと良いです。
コメント