お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。

TypeScriptで戻り値型がneverな関数を作る

投稿日:
言語::TypeScript

process.exit()のラッパーだったり、throwする関数だったりして、戻り値がneverを取る関数で、TypeScript上、後続処理がデッドロジックになるものを作る方法。

確認環境

Env Ver
TypeScript 5.4.5

やりたいこと

process.exit()を書くと次の行以降がデッドロジック扱いされるが、これをやりたい。

process.exit()を書くと次の行以降がデッドロジック扱いされる

問題点

普通に実装して型推論に任せてもうまくいかない。

例えば次の左図の関数の戻り値型はneverだが、右図ではデッドロジックとならない。

関数の戻り値型はnever
neverなのに後続がデッドロジック扱いされない

これは次のように戻り値の型にneverを直書きしても機能しない。

戻り値の型にneverを直書きしても機能しない

解決策

次の左図のように関数そのものの型を作ると解決できる。右図を見るとデッドロジックになっていることが確認できる。

関数そのものの型を作る
関数そのものの型があれば、後続もデッドロジック扱いされる

何のためにこれをやるか

別の関数から呼んだときに、呼び側の関数の戻り値型を正しくするためだ。下図はデッドロジックになっていない状態のときのものだが、処理が死なずに通り抜けてしまうのでundefinedが帰ることになっており、この関数の呼び下でundefinedだった時の処理を書く必要が出てきてしまう。

デッドロジック扱いされない状態では戻り値の状態が不正になる

しかし、デッドロジック扱いになっていれば下図のように戻り値の型が期待した通りの内容になる。この関数がundefinedを返すことはないので、この状態を実現するために行っている。

paste-image-2024-25-8_12-24-37-594.png

関連記事