TypeScript | 基礎文法:関数の基礎 – void型

TypeScript
スポンサーリンク

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 {
  // 戻り値を使う前提ではない関数
}
TypeScript

undefined 型を戻り値に書くことも技術的にはできますが、
「戻り値がない関数」を表したいときは 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 がしっくりきます。

「戻り値を“使うつもりがあるかどうか”」で、voidundefined を使い分ける——この感覚を持っておくと、設計がきれいになります。


void型を意識するときの設計の視点

void を付けるかどうかを考えるとき、こう自分に問いかけてみてください。

この関数は、「何か値を返すこと」が目的か?
それとも、「何かを実行すること(副作用)」が目的か?

前者なら、stringnumber やオブジェクトなど、具体的な型を書くべきです。
後者なら、void と書いて「戻り値は使わない前提だよ」と宣言するのが自然です。

void は、単に「何もない」という意味ではなく、
「この関数は“結果の値”ではなく、“行為そのもの”が目的なんだ」というメッセージでもあります。

だからこそ、ログ、通知、保存処理、イベントハンドラなど、
「やることがメインで、返すものは特にない」関数には、積極的に void を付けてあげると、
コードの意図がぐっと読みやすくなります。

タイトルとURLをコピーしました