never never 型
最終更新:2026-10-22
never never 型
never は「決して値にならない」ことを表します。エラーを投げる関数や無限ループする関数が返す型です。型レベルではすべての型のサブタイプであり、最も有名な使い方は switch の網羅性チェックです。
| グループ | 基本型 |
|---|---|
| 種類 | 型 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
function fail(msg: string): never {
throw new Error(msg);
}
// 網羅性チェック: default 節が case の漏れをコンパイルエラーに変える
type Shape = Circle | Square;
⚙️ パラメータ
| (): never | throw、無限ループ、または別の never 関数の呼び出しのみ許されます。普通の return はエラーになります |
|---|
戻り値:never 自体が「戻り値の型」です。関数が決して正常に戻らない(エラーを投げる、プロセスを終了する、無限ループする)ことを表します。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
caught: disk full
(トランスパイル後の実行出力。fail の中で return 1 を書くとコンパイルエラーになります。never 関数は正常に戻れないからです)
💡 ポイント
ℹ️ 説明 never はすべての型のサブタイプですが、never に代入できる値は存在しません(any でさえも)。これは「空集合」の型です。
💡 ヒント 網羅性チェックの定石は、switch の default に const _exhaustive: never = value と書くことです。ユニオンの分岐を新たに追加して処理を忘れると、ここですぐにコンパイルエラーになります(exhaustive-checks を参照)。
⚠️ 注意 never と void はどちらも「何も返さない」ように見えますが、意味はまったく異なります。void は正常に終了するが戻り値がないこと、never はそもそも正常に終了しないことです。
🏷️ 関連基本型
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q never と void の違いは何ですか?
A void は関数が正常に実行を終えるものの戻り値がないこと(ログなど)、never は関数が決して正常に戻らないこと(エラー送出や無限ループ)、または型レベルで値が存在しないことです。
Q never にはどんな実用的な用途がありますか?
A 主な用途は 2 つです。エラーを投げたり終了したりする関数の注釈と、網羅性チェック(switch の default で never に絞り込まれたユニオンの値を never 変数に代入し、漏れた分岐があればビルドが失敗する)です。条件型で never を使ってメンバーをフィルタすることもあります。
Q 自分の変数の型が never になったのはなぜですか?
A 通常はナローイングすぎです。例えばすべての可能性ある分岐を判定した後に残った型が空になったか、到達不能なコードに対して操作を行ったかです。制御フロー解析が残した型を確認してください。多くの場合、どこかの分岐の条件が重複して書かれています。