[TypeScript]Omitについて、実際に実装して理解する。

指定した型から任意のプロパティ除外して新たな型にする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を実装するにあたって、以下の方針で段階を踏んで実装していきます。

  1. MyOmit<T, K extends string | number | symbol>に指定されたプロパティのキー以外を羅列する
  2. それぞれのキーに対して、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に不慣れな人でも実装できると思います。
このように簡単な作業に分解することでこのようなものでなく、色々な問題も解決できるのでぜひ

コメント