void型は「値を返さないつもり」を表す型
void 型は、「この関数は“意味のある値”を返さない」という意図を型で表すための特別な型です。
function print(message: string): void {
console.log(message);
}
TypeScriptここで : void と書くことで、「print を呼んでも、呼び出し側が使うべき戻り値はない」という約束になります。
JavaScript 的には、戻り値を書かない関数は実行時には undefined を返しますが、TypeScript では「戻り値がないつもり」のときに void を使うのが一般的です。
JavaScriptのundefinedとvoid型の関係
JavaScriptでは、戻り値を書かない関数はこうなります。
function fn() {
// 何も返していない
}
const result = fn();
console.log(result); // 実行時は undefined
TypeScript実行時の値としては undefined が返りますが、TypeScript で戻り値型を書くときは、次のようにするのが普通です。
function fn(): void {
// 戻り値を使う前提ではない関数
}
TypeScriptundefined 型を戻り値に書くことも技術的にはできますが、
「戻り値がない関数」を表したいときは void を使い、
「戻り値として undefined がありうる関数」のときは number | undefined のようなユニオン型を使う、という使い分けが推奨されます。
典型的なvoid関数の例
ログを出すだけの関数
function logMessage(message: string): void {
console.log(message);
}
TypeScriptこの関数の目的は「ログを出すこと」であって、「何か値を返すこと」ではありません。void と書いておくことで、「この関数の戻り値を使う前提ではない」という意図が、型からも読み取れるようになります。
副作用だけを持つ関数
API を叩く、DOM を操作する、状態を更新する——こういった「副作用だけを持つ関数」は、戻り値を使わないことが多いです。
function saveUser(user: User): void {
// サーバーに送信するなど
}
TypeScript「何かを“して”終わる関数」は、void がよく似合います。
関数型の中でのvoid(コールバックなど)
void は、関数の型を書くときにもよく出てきます。
function greeter(fn: (msg: string) => void) {
fn("Hello");
}
function printToConsole(s: string) {
console.log(s);
}
greeter(printToConsole);
TypeScriptここで (msg: string) => void は、
「string を受け取って、戻り値を使う前提ではない関数」という意味です。
イベントハンドラやコールバック関数の型は、だいたいこの形になります。
type ClickHandler = () => void;
function onClick(handler: ClickHandler) {
handler();
}
TypeScript「呼び出す側は、戻り値を期待していない」ことを void がはっきり示してくれます。
voidとundefinedをどう使い分けるか
ここが少しだけ重要なポイントです。
「戻り値を使うつもりがない関数」
→ (): void と書くのが自然。
「戻り値として undefined が“ありうる”関数」
→ number | undefined のように、undefined をユニオン型の一部として使う。
function getIfExists(numbers: number[], search: number): number | undefined {
return numbers.find((n) => n === search);
}
TypeScriptこの関数は、「見つかれば number、見つからなければ undefined」を返すので、void ではなく number | undefined と書くのが正しい設計です。
一方で、
function notify(message: string): void {
alert(message);
}
TypeScriptのような関数は、「戻り値を使う前提がない」ので void がしっくりきます。
「戻り値を“使うつもりがあるかどうか”」で、void と undefined を使い分ける——この感覚を持っておくと、設計がきれいになります。
void型を意識するときの設計の視点
void を付けるかどうかを考えるとき、こう自分に問いかけてみてください。
この関数は、「何か値を返すこと」が目的か?
それとも、「何かを実行すること(副作用)」が目的か?
前者なら、string や number やオブジェクトなど、具体的な型を書くべきです。
後者なら、void と書いて「戻り値は使わない前提だよ」と宣言するのが自然です。
void は、単に「何もない」という意味ではなく、
「この関数は“結果の値”ではなく、“行為そのもの”が目的なんだ」というメッセージでもあります。
だからこそ、ログ、通知、保存処理、イベントハンドラなど、
「やることがメインで、返すものは特にない」関数には、積極的に void を付けてあげると、
コードの意図がぐっと読みやすくなります。
