Exclude<T, U>
Exclude<T, U>は、ユニオン型TからUで指定した型を取り除いたユニオン型を返すユーティリティ型です。
Exclude<T, U>の型引数
T
型引数Tには、ユニオン型を渡します。
U
型引数Uには、Tから取り除きたい型を渡します。
Excludeの使用例
tstypeGrade = "A" | "B" | "C" | "D" | "E";typePassGrade =Exclude <Grade , "E">;
tstypeGrade = "A" | "B" | "C" | "D" | "E";typePassGrade =Exclude <Grade , "E">;
上のPassGradeは次の型と同じになります。
tstypePassGrade = "A" | "B" | "C" | "D";
tstypePassGrade = "A" | "B" | "C" | "D";
Excludeの第2引数をユニオン型にすると、複数の型を取り除くこともできます。
tstypeGrade = "A" | "B" | "C" | "D" | "E";typePassGrade =Exclude <Grade , "D" | "E">;
tstypeGrade = "A" | "B" | "C" | "D" | "E";typePassGrade =Exclude <Grade , "D" | "E">;
Excludeの注意点
UはTの部分集合である制限がありません。つまり、Tに存在しない型をUに入れてしまったり、タイポなどに気をつけなければいけません。次の例は、Pull Requestに関する型と解釈してください。
tstypePullRequestState = "draft" | "reviewed" | "rejected";typeMergeableState =Exclude <PullRequestState , "draft" | "rejected">;
tstypePullRequestState = "draft" | "reviewed" | "rejected";typeMergeableState =Exclude <PullRequestState , "draft" | "rejected">;
MergeableStateはreviewedを意味しますが、このExcludeの使い方には2つの潜在的な問題があります。
PullRequestStateに新しい状態が追加された時
PullRequestStateにtestFailedというMergeableStateに含めたくない状態を追加したとします。するとこの修正に伴ってMergeableStateの第2引数も同時に修正しないといけません。これを忘れるとtestFailedはMergeableStateに含まれてしまいます。
tstypePullRequestState = "draft" | "reviewed" | "rejected" | "testFailed";typeMergeableState =Exclude <PullRequestState , "draft" | "rejected">;
tstypePullRequestState = "draft" | "reviewed" | "rejected" | "testFailed";typeMergeableState =Exclude <PullRequestState , "draft" | "rejected">;
変更した場合
PullRequestStateのdraftをopenに変更しました。この場合も、Excludeの第2引数の修正を忘れるとMergeableStateにopenが含まれてしまいます。
tstypePullRequestState = "open" | "reviewed" | "rejected";typeMergeableState =Exclude <PullRequestState , "draft" | "rejected">;
tstypePullRequestState = "open" | "reviewed" | "rejected";typeMergeableState =Exclude <PullRequestState , "draft" | "rejected">;