JavaScriptとTypeScriptにおけるオープンエンド関数引数

2024-04-11

JavaScriptとTypeScriptにおけるオープンエンド関数引数

オープンエンド関数引数とは?

JavaScriptでの例

function sum(...numbers) {
  let total = 0;
  for (const number of numbers) {
    total += number;
  }
  return total;
}

console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15

この例では、sum関数は...numbersという引数を受け取ります。...演算子は、渡された引数を配列に変換します。そのため、numbers変数には、呼び出し時に渡されたすべての数値が格納されます。

function sum(...numbers: number[]): number {
  let total = 0;
  for (const number of numbers) {
    total += number;
  }
  return total;
}

console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15

TypeScriptでは、引数の型も指定できます。この例では、sum関数はnumber型の引数のみを受け取るように定義されています。

オープンエンド関数引数を使うと、以下のような利点があります。

  • コードの汎用性と再利用性を向上させることができます。
  • 可変長の引数を扱う関数を簡単に定義できます。
  • コードをより簡潔に記述できます。
  • 渡された引数の型を事前に確認する必要があります。
  • 引数の個数に制限がない場合は、無限ループが発生する可能性があります。

オープンエンド関数引数は、JavaScriptとTypeScriptで便利な機能です。コードの汎用性と再利用性を向上させるために、積極的に活用しましょう。




JavaScript

// 1. 配列の要素をすべて足す関数

function sum(...numbers) {
  let total = 0;
  for (const number of numbers) {
    total += number;
  }
  return total;
}

console.log(sum([1, 2, 3])); // 6

// 2. 最大値と最小値を求める関数

function findMinMax(...numbers) {
  let min = numbers[0];
  let max = numbers[0];
  for (const number of numbers) {
    if (number < min) {
      min = number;
    } else if (number > max) {
      max = number;
    }
  }
  return { min, max };
}

const { min, max } = findMinMax(1, 2, 3, 4, 5);
console.log(`最小値: ${min}`); // 最小値: 1
console.log(`最大値: ${max}`); // 最大値: 5

// 3. オブジェクトのキーと値をすべて出力する関数

function printObject(...entries) {
  for (const entry of entries) {
    console.log(`${entry.key}: ${entry.value}`);
  }
}

const person = {
  name: "John Doe",
  age: 30,
  city: "Tokyo",
};

printObject(Object.entries(person));

// 出力例
// name: John Doe
// age: 30
// city: Tokyo

// 4. 可変長の引数を扱う関数

function doSomething(...args) {
  // argsには、呼び出し時に渡されたすべての引数が格納される
  console.log(args);
}

doSomething(1, 2, 3, "Hello", true);

// 出力例
// [1, 2, 3, "Hello", true]

TypeScript

// 1. 型付きのオープンエンド関数引数

function sum(...numbers: number[]): number {
  let total = 0;
  for (const number of numbers) {
    total += number;
  }
  return total;
}

console.log(sum(1, 2, 3)); // 6

// 2. ジェネリック型を使ったオープンエンド関数引数

function filter<T>(items: T[], predicate: (item: T) => boolean): T[] {
  const filteredItems = [];
  for (const item of items) {
    if (predicate(item)) {
      filteredItems.push(item);
    }
  }
  return filteredItems;
}

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



オープンエンド関数引数を実現する他の方法

argumentsオブジェクトは、関数内で呼び出し時に渡されたすべての引数にアクセスできます。ただし、argumentsオブジェクトは非推奨となっているため、新しいコードでは使用しないことを推奨します。

function sum() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

console.log(sum(1, 2, 3)); // 6

Restパラメータは、...演算子と同様の機能を提供します。ただし、Restパラメータはより新しい構文であり、argumentsオブジェクトよりも安全に使用できます。

function sum(...numbers) {
  let total = 0;
  for (const number of numbers) {
    total += number;
  }
  return total;
}

console.log(sum(1, 2, 3)); // 6

可変長引数関数は、引数の個数を事前に定義せずに呼び出すことができる関数です。ただし、可変長引数関数はブラウザやJavaScriptエンジンによってサポートされていない場合があります。

function sum() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

console.log(sum(1, 2, 3)); // 6

オープンエンド関数引数を実現する方法はいくつかあります。...演算子は、最も新しい


javascript typescript


ユーザーを魅了する!ページ最下部へ自動スクロールの魔法 スクロールバーはもう古い?JavaScript/jQueryで実現するスムーズな自動スクロール ワンクリックで最下部へ!ページ遷移も楽々!自動スクロールの実装方法 初心者でも安心!JavaScript/jQueryで自動スクロールに挑戦しよう 知っておけばよかった!自動スクロールを使いこなして快適なWebページを作ろう

以下のコードは、$(document).ready() 内で scrollTop() メソッドを使って、ページの一番下までスクロールします。このコードは、まず $(document).ready() を使って、DOMが読み込まれた後にスクロールを実行します。次に、$(document).height() でドキュメント全体の高さを取得し、$(document).scrollTop() でその高さをスクロール位置に設定します。...


Node.js で "SyntaxError: Unexpected token import" エラーが発生した時の対処方法

Node. js で "SyntaxError: Unexpected token import" エラーが発生する場合、いくつかの原因が考えられます。このエラーは、主に以下の3つの理由で発生します。モジュールの読み込みに import キーワードを使用している...


ReactでTypeScriptを使うなら知っておきたい!JSXファイル拡張子エラーの回避方法

このエラーは、TypeScript (.tsx) ファイルで JSX を使用しようとしたときに発生します。これは、ESLint の react/jsx-filename-extension ルールによって検出されます。このルールは、JSX を使用するファイルの拡張子が...


開発効率アップ!TypeScriptの「extends keyof」と「in keyof」で型操作をマスター

extends keyof と in keyof は、keyof と組み合わせて、より複雑な型の操作を行うための構文です。それぞれ、以下のような意味を持ちます。extends keyofextends keyof は、ある型が別の型のプロパティ名のいずれかを拡張する必要があることを表します。...


【JavaScript】型変換と演算子の優先順位が織りなす不思議な世界! 'b'+'a'+ + 'a' + 'a' が 'banana' になる魔法のコード

この動作を理解するには、JavaScript エンジンにおける文字列と数値の型変換、そして演算子の優先順位に関する知識が必要です。まず、JavaScript では、文字列と数値は異なる型として扱われます。文字列: 文字の羅列として表現されます。 例: "ba"...