タグ付きユニオン
どのバリアントなのかを示す明示的な「タグ」フィールドを持つユニオン型。C/C++のunionはタグなし(メモリを共有するだけで実行時エラーを招きやすい)だが、タグ付きユニオンは型情報を持ち、コンパイラが検証できる。
TypeScriptでは判別可能なユニオン型(discriminated union)と呼ぶ。type Result = { kind: 'ok'; value: number } | { kind: 'err'; error: string }のように書き、kindに対するswitchでコンパイラが型を絞り込む。Rustのenumは形式的にタグ付きユニオンで、各バリアントが暗黙の判別子を持つ。C++ならstd::variantとstd::visitだ。
典型的な用途はAPIのレスポンス型、ステートマシン、パーサーのASTノード。現代の型システムはタグ付きユニオンを安全に扱えるが、旧来のCのunionは違うフィールドを読んでしまい未定義動作を起こしうる、危険な構文である。