never型とは
「値をもたない」を意味する特殊な型。
never型は、通常、関数が正常に終了しないことを示す型です。
以下がサンプルコードです。
type Exclude<T, U> = T extends U ? never : T;
type Foo = Exclude<string | number | boolean, boolean> // string | number
このコードは、継承した U 型と一致する型を T 型の中から除外する型定義です。
ここでは、「type foo」の中で宣言された「Exclude」の第二引数に、「boolean」型が渡されているため、Foo 型は 「string | number」となります。
never型が多く使われる場面
never 型は主に、以下のように使われることが多い。
エラーのスロー(throwError関数)
function throwError(): never {
throw new Error();
}
このthrowError関数は、常にエラーをスローして例外的な状態に移行することが期待されます。
このような関数は、戻り値がないため、never型を返します。これにより、コンパイラはこの関数が例外をスローすることを理解し、他の部分でこの関数を呼び出す際には注意が必要であることを示唆します。
無限ループ(forever関数)
function forever(): never {
while (true) {} // 無限ループ
}
このforever関数は、条件が常に真であるため、終了しない無限ループを含んでいます。
このような関数もまた、正常に終了しないため、never型を返します。この型情報を使うことで、コンパイラはこの関数が終了しないことを理解し、他のコードとの統合や実行フローの解析において役立ちます。
また、以下のように存在しないことが保証される型を表現することもできる。
// 与えられた型 T が null または undefined の場合に never 型を返し、それ以外の場合には T 型を返す型エイリアス
type NonNullable<T> = T extends null | undefined ? never : T;
このコードでは、引数Tの中身が、「null」または「undefined」の場合に、「never」型を返し、それ以外であれば、引数の型を定義するコードです。
null, undefinedの場合に、never型を適用させることで、存在しないことが保証されることを定義するために、never型を使用します。
最後に
他にも色々な記事を書いているので、よければ読んでいってください、、、