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

typescript

指定した型が代入可能であれば、それを除外して新しい型を作成するExcludeというものがある。
今回はこれを自力で実装しながら理解することを目的とする。

Excludeとは

Excludeとは以下の書式を持つ組み込み型で、指定した型のうち、指定したプロパティを除外して新しい型にしてくれるものです。

// Exclude<T, U> Tに指定された型のうち、Uに代入可能な型を除外する。
// 全て代入可能であればneverを返す。
type User = {
  id: number;
  name: String;
  profile?: String;
};
type ExcludeUser = Exclude<keyof User, "id">;
// type ExcludeUser = {
//   id: number;
//   profile?: String;
// }

今回はこれを実装して理解していきます。
すなわち以下のMyExcludeを実装していきます。

type ExcludeUser = MyExclude<keyof User, "id">;
// type ExcludeUser = {
//   id: number;
//   profile?: String;
// }

MyExcludeの実装方針

MyExcludeを実装するにあたってはConditional Typesを使用して、TがUから継承可能であれば
never、そうでない場合はTを返すだけです。
今回はこれがそのまま答えになっちゃいますね。

type MyExclude<T, U> = T extends U ? never : T;


これは主に、Union Typesで特定のプロパティを除外するために利用されます。
ちょうどtypeof Userからidを除外したような使い方です。

まとめ

今回のExcludeの実装を説明しました。
Conditional Typesを使えば簡単でしたね。

分かってしまえば簡単なのですが、Conditional Typesはなかなか癖が強いので、どんどん使用してなれましょう。

コメント