Extract<U, G>
U
が、 G
の部分型ならば G
を返し、そうでなければ never
を返す
ユースケースとしては両方の引数がunion型であるものが多い
定義
tstype Extract<U, G> = U extends G ? U : never;
基本的に、 U
も G
もunion型で用いられることが多い
引数の順序を入れ替えても全く同じ結果になる
例えば、
tstype A1 = Extract<'X', 'X' | 'B' | 'C'>; // 'X'
type A2 = Extract<'X' | 'B' | 'C', 'X'>; // 'X'
tstype A3 = Extract<'a' | 'b' | 'c' | 'd', 'a' | 'c' | 'f'>; // 'a' | 'c'
type A4 = Extract<'a' | 'c' | 'f', 'a' | 'b' | 'c' | 'd'>; // 'a' | 'c'
以下のことがわかる
共通のものを抜き出している
引数の順序を入れ替えても結果は同じ
両方の引数がUnion型出ない場合は、定義通り「部分型かどうかのチェックをする」と表現した方がわかりやすい
例
tstype A5 = Extract<'X' | 'B', string>; // 'X' | 'B'
type A6 = Extract<string, 'X' | 'B'>; // never
tstype A7 = Extract<number, string>; // never
type A8 = Extract<string, number>; // never
recordからも取れる
tstype 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の時