Dev Study
← 解説「関数オーバーロード — 複数の呼び出し方を宣言する」に戻る

サンプルコードで身につける: 関数オーバーロード — 複数の呼び出し方を宣言する

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1個数違いの呼び出し方を2つ宣言する

オーバーロードの最小構成です。引数1個と2個、2通りの宣言を上に並べ、両方を受け止められる実装を1つだけ書きます。呼び出す側からは「商品名だけ」「商品名と個数」という2つの形が候補として見える、というのが宣言を分ける効果です。

TypeScript

2引数の位置の意味が呼び出し方で変わる関数

引数1個なら「終了値」、2個なら「開始値と終了値」のように、同じ位置の引数でも個数によって意味が変わる関数があります。オプション引数だけでは「1個目の意味が変わる」ことを表現できないため、宣言を分けて引数名ごと変えられるオーバーロードが活きます。

TypeScript

3呼び出し方ごとに戻り値の型を変える

オーバーロードでは引数だけでなく戻り値の型も宣言ごとに変えられます。個数を指定しなければ先頭の1件(string)、指定すれば配列(string[])が返る、という関係を呼び出す側に正確に見せられます。実装側の戻り値はいったん any でまとめていますが、外から見える型は宣言の方なので安全です。

TypeScript

43つ以上の宣言を並べる

オーバーロードシグネチャは2つまでという決まりはなく、必要なだけ並べられます。外から呼べるのは並べた宣言の形だけで、それ以外の呼び出しはすべてエラーになります。住所のように「詳しさの段階」がある組み立て処理を1つの関数にまとめる例です。

TypeScript

5通知の宛先を指定できる送信関数

実務のユーティリティ関数では「普段は既定の宛先、必要なときだけ宛先リストを指定」という呼び分けがよくあります。オプション引数1つでも動きますが、宣言を2つに分けることで「宛先を指定する呼び出し方がある」ことが関数の定義から読み取れるようになります。

TypeScript