指定した型から任意のプロパティ除外して新たな型にするOmit
というものがある。
今回はこれを自力で実装しながら理解することを目的とする。
Omitとは
Omit
とは以下の書式を持つ組み込み型で、指定した型のうち、指定したプロパティを除外して新しい型にしてくれるものです。
// Omit<T, K extends string | number | symbol> Tに指定された型のうち、Kに指定されたプロパティを除外する。
type User = {
id: number;
name: String;
profile: String;
};
type OmitUser = Omit<User, "id" | "name">;
// type OmitUser = {
// profile: String;
// }
今回はこれを実装して理解していきます。
すなわち以下のMyOmit
を実装していきます。
type OmitUser = MyOmit<User, "id" | "name">
// type OmitUser = {
// profile: String;
// }
MyOmitの実装方針
MyOmit
を実装するにあたって、以下の方針で段階を踏んで実装していきます。
MyOmit<T, K extends string | number | symbol>
に指定されたプロパティのキー以外を羅列する- それぞれのキーに対して、Tの型を設定する
では順に見ていきましょう
MyRequired<T>に指定されたプロパティのキー以外を羅列する
プロパティのキーを羅列するにはkeyof
を使用します。
そして、keyofの中から指定したキーを除外するのはExcludeを用います。
type Userkeys = keyof User;
// type Userkeys = "id" | "name" | "profile"
type ExcludeUserKeys = Exclude<keyof User, "id" | "name">;
// type ExcludeUserKeys = "profile"
Exclude
の使用方法については以下を参照
これで上記の例だとUser
のキーのうち、profile
だけ残すことが出来ました。
後はこの残ったキーに対して、型を設定していくだけですね。
それぞれのプロパティのキーに対して、Tの型を設定する。
TypeScriptにはMapped Types
と呼ばれる、元の型に基づいて新しい型を作成可能な仕組みがあります。
これを用いて、Tの型を設定していきます。
type MyOmit<T, K extends string | number | symbol> = {
[P in Exclude<keyof T, K>]: T[P];
};
type MyOmitUser = MyOmit<User, "id" | "name">;
// type MyOmitUser = {
// profile: String;
// }
まとめ
今回はOmit
の実装を順を追って実装していきました。
理解出来ましたでしょうか?
Excludeを使うので少し複雑でしたね。
順を追うとtypescriptに不慣れな人でも実装できると思います。
このように簡単な作業に分解することでこのようなものでなく、色々な問題も解決できるのでぜひ
コメント