mosya

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。

サイトの模写でプロを目指す
オンライン学習サービスを作りました!

詳しくはこちら
mosya

mosyaはオンラインでWeb制作を自学習できるサービスです。現役エンジニアが作成した豊富なカリキュラムに沿って学習を進めましょう。

© 2023 - mosya. All rights reserved.