TypeScript_関数

関数の定義

void関数

引数、戻り値の無い関数の定義は以下の通りです。


function func(): void {
  console.log('function');
}
func();

引数と返り値

TypeScriptでは、引数と返り値にデータ型を指定できます。


function func(msg: string): boolean {
  console.log(msg);
  return true;
}
console.log(func('type script'));

複数の引数を指定することもできます。

関数の戻り値は単一です。複数の値を返したい場合はオブジェクトで返します。


function func(msg: string, num: number): object {
  let obj = {
    'msg': msg,
    'num': num,
  };
  return obj;
}
let obj = func('type script', 1.4);
console.log(obj);

引数

デフォルト引数

TypeScriptでは、他言語のようにデフォルト引数がサポートされています。


function func(msg: string, num: number = 0): object {
  let obj = {
    'msg': msg,
    'num': num,
  };
  return obj;
}
let obj = func('type script');
console.log(obj);

任意引数(オプション引数)

任意引数とは、引数が無くてもコンパイルエラーにしない指定方法です。

JavaScriptでは、全ての引数が任意であり、それらを省くことが可能です。(その引数はundefinedになります。)

TypeScriptでは、この機能を「?」を対象引数の後ろに付けることで実装することが可能です。


function func(msg: string, num?: number): void {
  if (num) {
    console.log(msg + "-" + num);
  } else {
    console.log(msg);
  }
}
func('type script');

REST引数(可変長引数)

関数の引数名の前に ... を付けることによって、引数を可変長にすることができます。

可変長の引数は関数内で配列として取得します。


function func(... args: number[]): number {
  let sum: number = 0;
  for (let i: number = 0; i < args.length; i++) {
    sum += args[i];
  }
  return sum;
}
let ret: number = func(1, 2, 3, 4, 5, 6, 7, 8, 9);
console.log(ret);

関数

アロー関数式

アロー関数式は、=> を使用する形式です。function キーワードと関数名が省略可能です。


let add = (x: number): number => {
  return x + 1;
};
console.log(add(5));

ワンライナーで構成できる関数は、{} と return キーワードも省略可能です。


let add = (x: number): number => x + 1;
console.log(add(5));

関数の型注釈を省略することで、さらに () も省略可能です。


let add = x => x + 1;
console.log(add(5));

オーバーロード

TypeScript は関数のオーバーロードをサポートしており、引数や戻り値が異なる同名関数を宣言することができます。


function func(x: number): number;
function func(x: string, y?: boolean): string;
function func(x: boolean): number;

function func(x: any, y?: boolean): any {
  switch (typeof x) {
    case 'number':
      return x + 1;
    case 'string':
      if (y) {
        return x.toUpperCase();
      }
      return x.toLowerCase();
    case 'boolean':
      if (x) return 1;
      return 0;
    default:
      console.log('Syntax error.');
      break;
  }
}

console.log(func(1));  // 2
console.log(func('Overload'));       // overload
console.log(func('Overload', true)); // OVERLOAD
console.log(func(true));  // 1
console.log(func(false)); // 0

ジェネリック型(Generics、総称型)

ジェネリック型とは、型そのものをパラメータ化しておき、呼び出し時に指定する手法です。

関数オーバーロードのようなシグネチャの記述が不要になります。


function func<T>(x: T): any {
  switch (typeof x) {
    case 'number':
      return x + 1;
    case 'string':
      return x.toUpperCase();
    case 'boolean':
      if (x) return 1;
      return 0;
    default:
      console.log('Syntax error.');
      break;
  }
}

console.log(func<number>(1));          // 2
console.log(func<string>('Generics')); // overload
console.log(func<boolean>(true));      // 1

※任意引数の利用可否は仕様上不明ですが、複雑になるので利用しないほうがいいと思われます。



関連ページ