指定した型から任意のプロパティ除外して新たな型にする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に指定されたプロパティのキー以外を羅列する 
プロパティのキーを羅列するには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に不慣れな人でも実装できると思います。
このように簡単な作業に分解することでこのようなものでなく、色々な問題も解決できるのでぜひ
