関数

一連の処理をまとめて名前をつけ、引数を受け取り結果を返す再利用可能なコードの単位

プログラミング基礎

関数とは

関数 (Function) は、一連の処理をまとめて名前をつけたものである。引数 (入力) を受け取り、処理を行い、戻り値 (出力) を返す。同じ処理を何度も書く代わりに、関数として定義すれば 1 回書くだけで済む。

基本構文

function add(a: number, b: number): number {
  return a + b;
}

const result = add(3, 5); // 8

function キーワードで宣言し、引数の型と戻り値の型を指定する。return で値を呼び出し元に返す。

アロー関数

短い関数はアロー関数で簡潔に書ける。

const add = (a: number, b: number): number => a + b;

const greet = (name: string): string => {
  return `こんにちは、${name}さん`;
};

本体が 1 式だけなら {}return を省略できる。

引数のパターン

// デフォルト引数
function greet(name: string, greeting = "こんにちは"): string {
  return `${greeting}${name}さん`;
}

// 残余引数
function sum(...numbers: number[]): number {
  return numbers.reduce((a, b) => a + b, 0);
}

// オブジェクト引数 (分割代入)
function createUser({ name, age }: { name: string; age: number }) {
  return { name, age, createdAt: new Date() };
}

引数が 3 つ以上になる場合は、オブジェクトで渡すと呼び出し側の可読性が上がる。

戻り値

関数は return で値を返す。return がない関数は undefined を返す。

// 値を返す関数
function square(n: number): number {
  return n * n;
}

// 値を返さない関数 (副作用のみ)
function log(message: string): void {
  console.log(message);
}

戻り値の型を void と明示すると、値を返さない意図が伝わる。

関数の設計原則

原則 説明
単一責任 1 つの関数は 1 つのことだけを行う
短く保つ 20〜30 行以内が目安
命名で意図を伝える getData より fetchUserById
副作用を最小化 外部状態の変更を避ける

純粋関数と副作用

同じ引数に対して常に同じ結果を返し、外部に影響を与えない関数を純粋関数と呼ぶ。

// 純粋関数: 外部に依存しない
function double(n: number): number {
  return n * 2;
}

// 非純粋関数: 外部状態を変更する
let count = 0;
function increment(): number {
  count += 1; // 副作用
  return count;
}

純粋関数はテストしやすく、バグが入りにくい。

コールバック関数

関数を別の関数の引数として渡すパターンをコールバックと呼ぶ。

const numbers = [1, 2, 3, 4, 5];
const even = numbers.filter(n => n % 2 === 0); // [2, 4]

filter に渡している n => n % 2 === 0 がコールバック関数である。

関数のオーバーロード

TypeScript では同じ名前で異なるシグネチャを定義できる。

function format(value: number): string;
function format(value: Date): string;
function format(value: number | Date): string {
  if (typeof value === "number") return value.toFixed(2);
  return value.toISOString();
}

よくある間違い

間違い 問題 対策
関数が長すぎる 可読性・テスト性の低下 小さな関数に分割
引数が多すぎる 呼び出し側が混乱 オブジェクト引数にまとめる
戻り値の型が曖昧 呼び出し側でバグ 型を明示する
関数名と処理の不一致 誤解を招く 名前を処理に合わせる

関数設計の考え方は関連書籍に詳しい。

この記事は役に立ちましたか?

関連用語

関連する記事