mosya<TC> - 特定のフィールドが一致するオブジェクトを取り出す
この記事はmosya<TC>の問題の一つであるLookUp型の解説になります。
問題
Union 型から特定の型を属性を使って取得したいことがあります。
この課題では、Cat | Dog
という Union 型に共通する type というフィールドを使って、対応する型を取得します。つまり、以下の例のように、 LookUp<Dog | Cat, 'dog'>
の場合は Dog を、LookUp<Dog | Cat, 'cat'>
の場合は Cat を取得することになります。
interface Cat {
type: "cat";
breeds:
| "Abyssinian"
| "Shorthair"
| "Curl"
| "Bengal";
}
interface Dog {
type: "dog";
breeds:
| "Hound"
| "Brittany"
| "Bulldog"
| "Boxer";
color: "brown" | "white" | "black";
}
type MyDog = LookUp<Cat | Dog, "dog">; // expected to be `Dog`
解答例
type LookUp<U, T> = U extends {
type: T;
}
? U
: never;
今回は、第二引数で指定されたT
の型をtype
プロパティに持つ型を継承していることが条件なので、U extends { type: T }
という条件を指定します。
Conditional Type
であるextends
構文を使い、条件に当てはまらない場合はnever
を返すことでユニオン型の中から条件に合う型だけを取得することができます。
Authored by
Godai@steelydylan
Webサービスを作るのが好きなWebエンジニア。子供が産まれたことをきっかけに独立し法人化。サービス開発が大好き。
好きな言語はTypeScript。