generated at
Extract<U, G>
U が、 G の部分型ならば G を返し、そうでなければ never を返す
ユースケースとしては両方の引数がunion型であるものが多い


定義
ts
type Extract<U, G> = U extends G ? U : never;


基本的に、 U G もunion型で用いられることが多い
その場合、説明を簡略化して「2つのunion型の間で共通のものを取り出す」と表現できる
引数の順序を入れ替えても全く同じ結果になる
例えば、
ts
type A1 = Extract<'X', 'X' | 'B' | 'C'>; // 'X' type A2 = Extract<'X' | 'B' | 'C', 'X'>; // 'X'
ts
type A3 = Extract<'a' | 'b' | 'c' | 'd', 'a' | 'c' | 'f'>; // 'a' | 'c' type A4 = Extract<'a' | 'c' | 'f',             'a' | 'b' | 'c' | 'd'>; // 'a' | 'c'
以下のことがわかる
共通のものを抜き出している
引数の順序を入れ替えても結果は同じ



両方の引数がUnion型出ない場合は、定義通り「部分型かどうかのチェックをする」と表現した方がわかりやすい
ts
type A5 = Extract<'X' | 'B', string>; // 'X' | 'B' type A6 = Extract<string, 'X' | 'B'>; // never
ts
type A7 = Extract<number, string>; // never type A8 = Extract<string, number>; // never


recordからも取れる
ts
type Drink = | { category: "coffee"; origin: string } | { category: "tea"; region: string; flavor: string }; type T1 = Extract<Drink, { category: "coffee" }>; // ^? { category: "coffee"; origin: string }



応用例
Extract<U, G> の第1引数がRecordのUnionの時