指定した型が代入可能であれば、それを除外して新しい型を作成する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
はなかなか癖が強いので、どんどん使用してなれましょう。
コメント