読み込み中...

TypeScriptでvoid型をマスターする手法10選

TypeScriptで学ぶvoid型の基本と応用のサンプルコード10選 TypeScript
この記事は約28分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

今日はTypeScriptのvoid型に焦点を当てた解説を行います。

初心者の方でも十分に理解できるよう、基本から応用までをわかりやすく説明していきます。

さらに、10つのサンプルコードを交えながら、void型の使い方や注意点を学んでいきましょう。

まずはTypeScript自体の基本的な特性について紐解いていきます。

●TypeScriptとは

TypeScriptは、Microsoftによって開発されたJavaScriptのスーパーセットです。

JavaScriptの全ての機能を含みつつ、型安全性を追加したプログラム言語として広く利用されています。

TypeScriptはコンパイル時に型検査を行うことができ、それによって多くのエラーを早期に捉えることができます。

これにより、大規模なプロジェクトでも安全かつ効率的にコーディングを行うことが可能となります。

○基本的な特性

TypeScriptの最も重要な特性の一つは、静的型付けを採用していることです。

静的型付けとは、変数や関数の引数、戻り値に型を指定できる機能のことです。

この特性により、コードの品質を向上させ、バグを早期に発見することが可能です。

また、TypeScriptはオブジェクト指向プログラミングの特性を備えており、クラスやインターフェイスなどを利用してコードを構造化することができます。

さらに、モジュールシステムを利用してコードを分割・組織することもでき、これにより再利用性と保守性が向上します。

○void型とは

TypeScriptのデータ型の一つであるvoid型について詳しく解説します。

void型は、特定の値を返さない関数の戻り値として使用される型です。

具体的には、functionキーワードを使って関数を定義する際、戻り値の型としてvoidを指定することが主な用途となります。

次に具体的なコード例とその解説を見ていきましょう。

// このコードではvoid型を使って関数を定義しています。
function greet(): void {
    console.log("Hello, TypeScript!");
}

このコードを実行すると、”Hello, TypeScript!”というメッセージがコンソールに表示された結果、何も返さない(undefined)ことになります。

void型は関数が値を返さないことを示すために用いられるため、戻り値に具体的な値が存在しない関数に対して指定されます。

このvoid型は、関数が副作用(この場合はコンソールにメッセージを表示する)のみを持ち、特定の値を返さない場合に使います。

このような関数は、特定の操作を行うが、その操作に対する「返答」を提供しない場合によく使われます。

さらに、void型は主に関数の戻り値として用いられますが、変数にもvoid型を指定することが可能です。

ただし、その変数にはundefinedまたはnullしか割り当てることができません。

下記のサンプルコードは、void型を変数に指定した例です。

// このコードではvoid型を使って変数を定義しています。
let unusable: void = undefined;

このコードを実行すると、変数unusableはundefinedという値を持つことになり、他の値を割り当てることができません。

この特性により、void型を利用して明示的に値が存在しないことを表すことが可能です。

●void型の基本理解

void型は、TypeScriptで関数が何も返さないことを表す型です。

他のプログラミング言語でも同様の役割を持つ場合が多いのですが、TypeScriptの文脈では、関数が何も返さないことを明示的に表すためにvoid型を使用します。

○void型の役割と特性

void型が表す「何も返さない」という性質は、実際には「undefined」という値を返すことと等価です。

しかし、意図的に何も返さない関数と、返り値を忘れてしまった関数を区別するため、void型を使用するのが推奨されています。

JavaScriptにおいて、返り値が存在しない関数は、実際にはundefinedを返します。

しかし、TypeScriptにおいては、明示的に何も返さないことを示すためのvoid型が存在するのです。

○void型の適切な使用場面

void型を適切に使用するための基本的な指針は次のようになります。

  1. 関数が何も返さない場合、戻り値の型としてvoidを指定します。
  2. 関数の中でreturn文を使わず、何かの処理だけを実行する場合は、void型を使用するのが適しています。
  3. イベントハンドラやコールバック関数など、特定のアクションをトリガーとして何かの処理を実行するが、その結果を外部に返す必要がない場合に、void型を使用します。

例えば、ボタンのクリックイベントのハンドラとして関数を定義する場合、この関数はクリックされたときの処理を記述しますが、その結果を外部に返すことはほとんどありません。

このような場合に、void型を使用するのが適しています。

●void型の使い方

TypeScriptでのプログラミングにおいて、データ型は非常に重要な要素となります。

その中でもvoid型は特殊な存在として知られており、ここではその使い方に関して詳細に解説します。

特に初心者の方が理解しやすくなるように、具体的なサンプルコードとその解説を交えて説明していきます。

○サンプルコード1:void型を使った関数の作成

まず初めに、void型を使用した基本的な関数の作成方法について見ていきましょう。

void型は、関数が特定の値を返さないことを示すために使用されます。

void型を返却型として指定した関数のサンプルコードを紹介します。

function greet(): void {
  console.log('Hello, TypeScript!');
}

このコードではgreetという名前の関数を定義しています。そしてこの関数はvoidという型を返却型として指定しています。

このため、関数内でreturnステートメントを用いて何かを返すことはできません。

次に、この関数の呼び出し方についても確認しましょう。

greet(); // 実行結果: Hello, TypeScript! がコンソールに表示されます

このコードを実行すると、”Hello, TypeScript!”というメッセージがコンソールに表示されます。

関数greetは何も返さないので、その返り値を変数に代入しようとするとTypeScriptのコンパイラーからエラーが報告される点に注意してください。

例えば次のようなコードは、TypeScriptコンパイラーによってエラーとして認識されます。

let message: string = greet(); // エラー: Type 'void' is not assignable to type 'string'.

このコードでは、greet関数の返り値をstring型の変数messageに代入しようとしています。

しかし、greet関数はvoid型の値を返すため、このコードはコンパイル時にエラーが発生します。

○サンプルコード2:void型を返すアロー関数

ここでは、void型を返すアロー関数の作成について紹介します。

アロー関数は、従来のfunction構文よりも簡潔に関数を記述できるES6から導入された構文です。

そして、void型は関数が特定の値を返さないことを表すために用いられます。

それでは具体的なサンプルコードとその解説を見ていきましょう。

まず初めに、次のようなvoid型を返す簡単なアロー関数を見ていきましょう。

const greet = (): void => {
  console.log("Hello, TypeScript!");
};

このコードでは、greetという名前のアロー関数を定義しています。

():という部分で引数のリストを表し、その後にvoidと記述することで、この関数は何も返さない(void)ことを表しています。

関数の本体は、コンソールに”Hello, TypeScript!”と出力するだけです。

このコードを実行すると、コンソールに”Hello, TypeScript!”と表示されますが、関数greetは何も返さないため、返り値としてはundefinedとなります。

これは、JavaScript及びTypeScriptにおけるvoid型の挙動です。

次に、より実践的な例として、void型を返すアロー関数を使ったイベントハンドラの例を見てみましょう。

type EventHandler = (event: Event) => void;

const handleClick: EventHandler = (event) => {
  console.log("Element clicked:", event);
};

document.querySelector("#button").addEventListener("click", handleClick);

このコードではEventHandlerという名前の新しい型を定義しています。

この型は、Eventオブジェクトを受け取り、voidを返す関数の型を表しています。

handleClickというアロー関数は、この型に従って定義され、クリックイベントが発生した時にコンソールにイベントオブジェクトをログとして出力します。

最後に、このhandleClick関数をaddEventListenerメソッドを使ってボタンのクリックイベントハンドラとして登録しています。

このコードを実行すると、IDが”button”のHTML要素がクリックされると、コンソールに”Element clicked:”と共にイベントオブジェクトが表示されます。

しかし、handleClick関数は何も返さないため、関数の実行結果としては何も返されません。

○サンプルコード3:void型の変数の使用

こんにちは、プログラミングの学習を進める皆様。

ここでは、TypeScriptでのvoid型変数の使用方法に焦点を当て、その役割と適用例を深堀りしていきます。

サンプルコードを交えて、初心者でも理解しやすいよう、丁寧な説明を心がけます。

それでは早速、探究していきましょう。

まず最初に、void型変数の基本的な定義から見ていきます。

void型は、関数が特定の値を返さないことを示すために使用されますが、変数としても利用可能です。

ただし、void型の変数はundefinedのみを持つことができます。

次のコードを見てみましょう。

let v: void = undefined;

このコードでは、変数vをvoid型として宣言しています。

そして、この変数にundefinedを割り当てています。

通常、void型は関数の戻り値として使用されますが、変数としての使用も可能であることがわかります。

しかし、なぜこのような使い方が必要なのか疑問に思うかもしれません。

このようなケースは、関数が副作用を持つが値を返さない場合に役立ちます。

つまり、処理は行いますが、結果を返さない関数の場合にvoid型変数が使用されることがあります。

次に、このvoid型変数の使用法を実際の関数内で確認してみましょう。

function displayMessage(message: string): void {
  console.log(message);
  return undefined;
}

const result: void = displayMessage("Hello TypeScript!");
console.log(result); // 出力:undefined

このコードを実行すると、最初に”Hello TypeScript!”というメッセージがコンソールに表示されます。

次に、関数displayMessageの戻り値(undefined)がコンソールに表示されます。

この関数displayMessageは、引数として文字列を受け取り、それをコンソールに表示します。

しかし、戻り値はvoid型として指定されているため、関数からの返り値はundefinedとなります。

そのため、result変数もvoid型として宣言され、関数からの戻り値(undefined)を受け取ることができます。

また、void型を使った関数内での副作用の制御をすることも可能です。

下記のコードは、void型の変数を使って関数内での副作用を明示的に表しています。

function processData(data: string): void {
  // dataの処理
  console.log(data.toUpperCase());

  let result: void = undefined;
  // 何らかの副作用
  result = undefined;
}

このコードでは、processData関数がstring型のdataを引数として受け取り、それを処理(ここではtoUpperCaseメソッドを使用して大文字に変換)しています。

そして、result変数はvoid型として宣言され、関数内での副作用を持つことを表しています。

このように、void型変数はコードの読者に関数の副作用を明示的に表す手段として使えます。

●void型の応用例

TypeScriptのプログラムにおけるvoid型は、通常、関数が特定の値を返さない場合に使用されます。

しかし、void型を効果的に利用するためのいくつか応用例があります。

今回は、void型と他の型との組み合わせに焦点を当てて、詳細な説明とサンプルコードを提供します。

○サンプルコード4:void型と他の型との組み合わせ

TypeScriptでvoid型を他の型と組み合わせることは、プログラムの柔軟性と保守性を高めるための一策となることがあります。

下記のサンプルコードは、void型と他の型との組み合わせを表す一例です。

function logOrReturn(value: string | void): void {
  if (value !== undefined) {
    console.log(value);
  } else {
    console.log("値が提供されませんでした。");
  }
}

このコードでは、logOrReturnという関数を定義しています。

この関数は、string型またはvoid型のパラメーターを受け取り、void型を返します。

関数内部でパラメーターvalueundefinedでないかどうかを確認し、それに応じて異なるメッセージをコンソールにログするようにしています。

コードを実行すると、次のような結果が得られます。

logOrReturn("こんにちは");
// コンソールには "こんにちは" が表示されます。

logOrReturn(undefined);
// コンソールには "値が提供されませんでした。" と表示されます。

この例は、関数が特定の型の値またはundefined(void型)を受け取る場合に、どのようにvoid型を活用できるかを表しています。

関数は、提供された値がundefinedかどうかを確認し、その結果に基づいて異なるアクションを実行します。

このコードの実行結果は、第一のlogOrReturn関数呼び出しは、渡された文字列をコンソールに出力し、第二のlogOrReturn関数呼び出しは、渡された値がundefinedであるため、異なるメッセージをコンソールに出力します。

このように、void型を他の型と組み合わせることで、関数の振る舞いを柔軟に制御できます。

○サンプルコード5:void型を使ったコールバック関数

ここでは、void型を用いたコールバック関数の作成とその具体的な利用法を解説します。

コールバック関数は、ある関数の引数として渡され、その関数の内部で呼び出される関数のことを言います。

そして、void型は、関数が特定の値を返さないことを示す型です。ここでは、これを利用して、コールバック関数を作成してみます。

まず、基本的な形を見ていきましょう。

下記のコードは、void型を返すコールバック関数の基本的な形を表しています。

function withCallback(callback: () => void): void {
  console.log('関数が実行されました');
  callback();
}

このコードでは、withCallbackという関数を定義しています。

この関数は、void型を返すコールバック関数callbackを引数として受け取ります。

そして、console.logでメッセージを表示した後に、受け取ったコールバック関数を実行します。

このコードを実行すると、まずは「関数が実行されました」というメッセージが表示され、その後でコールバック関数が実行されます。

では、実際にコールバック関数を作成し、withCallback関数に渡して実行してみましょう。

withCallback(() => {
  console.log('コールバック関数が実行されました');
});

このコードを実行すると、まずはwithCallback関数が実行され、「関数が実行されました」というメッセージが表示されます。

その後でコールバック関数が実行され、「コールバック関数が実行されました」というメッセージが表示されます。

次に、コールバック関数にパラメータを追加して、更に詳しく見ていきましょう。

下記のコードでは、コールバック関数にstring型のパラメータを追加し、それを用いてメッセージを表示します。

function withCallback(callback: (msg: string) => void): void {
  console.log('関数が実行されました');
  callback('こんにちは!');
}

このコードでは、コールバック関数がstring型のパラメータmsgを受け取ることができます。

そして、withCallback関数の内部で、コールバック関数を「こんにちは!」というメッセージと共に実行します。

コールバック関数はこのメッセージを受け取って、それを表示します。

次に、実際にこのコードを用いた実行例を見てみましょう。

withCallback((msg) => {
  console.log('コールバック関数が実行されました: ' + msg);
});

このコードを実行すると、まずは「関数が実行されました」というメッセージが表示されます。

その後でコールバック関数が実行され、「コールバック関数が実行されました: こんにちは!」というメッセージが表示されます。

○サンプルコード6:void型の高度な利用方法

ここでは、void型を高度な方法で利用するサンプルコードを紹介し、そのコードの解析と実行結果を深く探ります。

前回紹介した基本的な使用法を理解した上で、更なるステップアップを目指しましょう。

まず、サンプルコードを見てみましょう。

function processAndHandle(data: string, callback: (response: string) => void): void {
    let processedData = data.toUpperCase();
    callback(processedData);
}

このコードでは、processAndHandleという関数を定義しています。

この関数は2つのパラメータを受け取ります。

一つ目はdataという文字列型のパラメータで、二つ目はcallbackという関数型のパラメータです。

callback関数はresponseという文字列型のパラメータを受け取り、void型を返します。

また、processAndHandle関数もvoid型を返します。

このコードを実行すると、まずprocessAndHandle関数では、入力されたdataを大文字に変換する処理が行われます。

そして、その変換されたデータをcallback関数に渡し、実行します。

このコードを実行すると、文字列データが処理された結果、callback関数が呼び出されるというフローを形成します。

次に、この関数をどのように使うか見てみましょう。

processAndHandle("typescript", (response) => {
    console.log("Processed data: ", response);
});

このコードを実行すると、コンソールに”Processed data: TYPESCRIPT”と表示されます。

このコードの動作原理は次の通りです。

まず、processAndHandle関数を呼び出し、”typescript”という文字列とコールバック関数を引数として渡します。

このコールバック関数は、processAndHandle関数内で処理されたデータ(この場合は大文字に変換されたデータ)を受け取り、コンソールにログを出力します。

●void型の注意点と対処法

TypeScriptのvoid型は、特に関数の戻り値として使われることが多い型の一つですが、その使い方や特性にはいくつかの注意点があります。

初心者の方でも十分に理解できるよう、ここではvoid型の注意点とそれに対する対処法をサンプルコードを交えて詳細に解説します。

○データ型の違いによるエラー

初めに、void型の関数が何らかの値を返そうとすると、データ型の違いによるエラーが発生することがあります。

例として、次のようなコードがあります。

function showMessage(): void {
  const message = "Hello, TypeScript!";
  return message; // エラー: 'void'型の関数が値を返しています
}

このコードでは、void型を使ってメッセージを表示する関数を定義しています。

しかし、return文を使って文字列を返そうとしているため、TypeScriptコンパイラはエラーを報告します。

このコードを実行すると、データ型の違いによってエラーが発生し、コンパイルできません。

解決法としては、void型の関数ではreturn文を使用せず、単に処理を行うだけのコードを記述するよう心掛けましょう。

下記のコードは修正後のサンプルとなります。

function showMessage(): void {
  const message = "Hello, TypeScript!";
  console.log(message); // 正しく、エラーが発生しません
}

このコードを実行すると、コンソールに「Hello, TypeScript!」と表示され、何のエラーも発生しません。

これはvoid型の関数が値を返さないように修正したためです。

○解決策と注意点

void型を用いる際には、いくつかの解決策と注意点があります。

特に、関数の戻り値としてvoid型を使用する際には注意が必要です。

  1. 関数の戻り値としてvoid型を指定した場合、その関数は何らかの値を返してはいけません。
    返す場合は、適切なデータ型を指定しましょう。
  2. void型の変数は、nullやundefinedを代入できますが、これらの値以外の値を代入するとエラーが発生します。
    これを避けるためには、変数の型としてvoid型を避け、他の型を使用することをお勧めします。

次に、次のコードはvoid型の変数にundefinedを代入する例です。

let variable: void = undefined;

このコードでは、void型の変数variableにundefinedを代入しています。

void型の変数は基本的には使用されることがないため、このようなコードは実際にはほとんど見られません。

しかし、void型の変数を使う場合は、undefinedを代入することが一般的です。

また、次のようなコードはエラーとなります。

let variable: void = "text"; // エラー: 'string'型の値を'void'型の変数に代入しようとしています

このコードを実行すると、「string型の値をvoid型の変数に代入しようとしています」というエラーメッセージが表示されます。

これはvoid型の変数にstring型の値を代入しようとしたためです。

このようなエラーを防ぐためには、void型を適切に使用し、void型の変数に非適合な値を代入しないよう心掛けましょう。

そして、void型の関数や変数の使用法を理解し、それに沿ったコーディングを行うことが重要です。

●void型のカスタマイズ方法

TypeScriptのプログラミングを行う際、様々なデータ型が用意されており、その中でもvoid型は特別な役割を担っています。

今回はvoid型のカスタマイズ方法に焦点を当て、サンプルコードを交えながら詳しく解説していきます。

まず、void型とは、特定の値を返さない関数の戻り値として使用される型を指します。

TypeScriptにおけるvoid型のカスタマイズは、関数の挙動や返り値を特定の方法で制御するために利用されます。

このコード例では、void型を利用して特定の関数の返り値を制御しています。

type CustomVoid = void | 'fallback';

function exampleFunction(param: number): CustomVoid {
  if (param > 0) {
    console.log('Param is positive');
  } else {
    return 'fallback';
  }
}

このコードでは、新しい型CustomVoidを定義しています。この型はvoid型または’fallback’という文字列を返すことができます。

そしてexampleFunctionという関数では、引数paramが0より大きい場合、コンソールにメッセージを表示します。

0以下の場合は、’fallback’という文字列を返します。

実行結果としては、もしparamに正の数を入れて関数を実行した場合、「Param is positive」という文字がコンソールに表示されます。

そしてparamに0や負の数を入れた場合、関数は’fallback’という文字列を返します。

○サンプルコード8:void型を含むユニオン型の利用

TypeScriptでプログラムを構築する際、ある変数が複数の型を取りうる場合、ユニオン型が非常に役立ちます。

ここでは、ユニオン型の中でvoid型を使った実用的な例をご紹介します。

また、具体的なコード例を通じて、この概念がいかに有効であるかを説明します。

さらに、コードの実行結果についても触れますので、ぜひ参考にしてください。

では、まずは基本的なユニオン型の作成から見ていきましょう。

下記のコードは、void型を含むユニオン型を表しています。

type ResponseType = string | number | void;

function processResponse(response: ResponseType) {
  if (typeof response === "string") {
    console.log("文字列として処理: ", response);
  } else if (typeof response === "number") {
    console.log("数字として処理: ", response);
  } else {
    console.log("未定義のレスポンス");
  }
}

processResponse("こんにちは");
processResponse(123);
processResponse(undefined);

このコードではResponseTypeというユニオン型を使っている点に注目してください。

ユニオン型は|string|number|void|を利用して、string型、number型、void型のいずれかを取ることができます。

そして、processResponseという関数を定義しています。

この関数は、引数としてResponseTypeを受け取り、その型に応じた処理を行います。

また、このコードを実行すると、次のような出力が得られることを期待します。

文字列として処理: こんにちは
数字として処理: 123
未定義のレスポンス

この結果から、ResponseTypeが取りうる各種型が適切に処理されることが確認できます。

次に、このサンプルコードの一部を利用した小さなプロジェクトでの応用例を見ていきましょう。

例えば、Webサーバーからのレスポンスを処理する関数を設計する際にも、このようなユニオン型が非常に有用です。

type ServerResponse = string | number | void;

async function fetchData(url: string): Promise<ServerResponse> {
  let response: ServerResponse;
  // ここではサーバーからのデータフェッチをシミュレートします(実際の実装では、適切なデータフェッチのメソッドを使用します)
  response = "データ取得成功"; // シミュレーションのため固定値を設定
  return response;
}

async function main() {
  const url = "https://api.example.com/data";
  const response = await fetchData(url);
  if (typeof response === "string") {
    console.log("サーバーからのレスポンス: ", response);
  } else if (typeof response === "number") {
    console.log("エラーコード: ", response);
  } else {
    console.log("未知のエラー");
  }
}

main();

このコードを実行すると、「サーバーからのレスポンス: データ取得成功」という出力を得られます。

これは、fetchData関数が正常にstring型のレスポンスを返し、main関数がそれを適切に処理していることを表します。

○サンプルコード9:void型の型アサーション

TypeScriptでのプログラム開発を進める中で、特定の型への変換や、型の保証が必要になる場合があります。

ここでは、void型を使った型アサーションの使い方とその実行結果について解説します。

まず、型アサーションとは、TypeScriptで特定の変数が想定している型であることを明示的に指定する方法です。

これによりコンパイラは、その変数を指定した型として扱います。

しかし、void型は何も返さないことを表す特殊な型であり、型アサーションと組み合わせる際には注意が必要です。

ここでは、void型の型アサーションを使用するサンプルコードとその詳細な説明を提供します。

また、コードの実行後の結果も交えて解説します。

次のようなコードを参照してください。

function exampleFunction(): void {
  console.log("この関数はvoid型を返します。");
}

const result: void = exampleFunction() as void;
console.log(result);

このコードでは、exampleFunctionという関数を定義しています。

この関数は、void型を返すように宣言されており、コンソールにメッセージを出力します。

そして、関数の返り値をvoid型として型アサーションを使用してresult変数に割り当てています。

このコードを実行すると、まず”この関数はvoid型を返します。”というメッセージがコンソールに表示されます。

その後、result変数がundefined(void型の関数が返すデフォルトの値)であるため、コンソールにはundefinedが表示されます。

次のような実行結果となります。

この関数はvoid型を返します。
undefined

ここではvoid型の関数の返り値をvoid型の変数に割り当てていることで、コンパイラの型チェックを満たしています。

しかし、void型は何も返さないことを示す型なので、型アサーションによって特に有用な情報を得ることはできません。

○サンプルコード10:void型とGenericsの組み合わせ

当てはまるプログラミングコンセプトの理解が不可欠な領域に入ってきました。

ここでは、TypeScriptのvoid型とGenericsの組み合わせ方について詳しく見ていきます。

コードの構造や実行結果、注意点や応用例までを丁寧に説明していくので、是非最後までご覧ください。

まず最初に、void型とGenericsが何であるかの基本的な説明から始めます。

void型は、関数が特定の値を返さないことを示す型です。

一方で、Genericsは型の再利用性を高めるためのツールであり、様々な型に対応する一種のテンプレートとして機能します。

このコードでは、Genericsを利用して関数を定義し、その関数がvoid型を返すようにします。

それでは、サンプルコードとその詳細な説明を見ていきましょう。

function exampleFunction<T>(input: T): void {
  console.log(input);
  // 何も返さない
}

このコードでは、exampleFunctionという名前の関数を定義しています。

関数は一般的なジェネリクス<T>を使っており、これによって任意の型Tの引数を受け取ることができます。

そしてこの関数は、何も返さない、つまりvoid型を返します。

関数内部で、引数inputをコンソールにログする操作を行いますが、return文は用いられていません。

これがvoid型の役割です。関数が何も返さないことを示し、コンパイラにその意図を明示的に表しています。

それでは、このコードを実行するとどのような結果が得られるか見ていきましょう。

実際にこの関数を呼び出すと、関数に渡した引数がコンソールにログされます。

しかし、関数からは何も返されません。

これはvoid型の特性を表す明確な例です。

次のように関数を呼び出して実行結果を確認できます。

exampleFunction<string>("Hello, TypeScript!");
// コンソール出力: "Hello, TypeScript!"

このようにして、void型とGenericsを組み合わせた関数の実行結果がコンソールにログされることが確認できます。

次に、Genericsを利用して異なる型の引数を受け取ることができる点を挙げます。

この柔軟性は、Genericsの強力な機能の一つです。

さまざまな型の引数を受け取ることができるこの関数の例を紹介します。

exampleFunction<number>(12345);
// コンソール出力: 12345

exampleFunction<boolean>(true);
// コンソール出力: true

これらの実行例からも分かるように、exampleFunctionはどのような型の引数でも受け取ることができ、それをコンソールにログします。

しかし、関数自体は何も返しません。

ここで注意しなければならない点は、void型を返す関数は、返り値として何も提供しないため、返り値を変数に格納しようとするとTypeScriptコンパイラによってエラーが発生するということです。

例えば、次のようなコードはエラーが発生します。

let result = exampleFunction<number>(12345);
// エラー: Type 'void' is not assignable to type '...'.

まとめ

今回は、void型の基本的な特性や使い方を、サンプルコードを交えながら解説しました。

サンプルコードでは、void型を使用するさまざまなシナリオを表し、それぞれのコードがどのように動作するかも説明しました。

プログラミングの学習は継続が鍵ですので、これからも継続的に学習を進めてください。