ページへ戻る

− Links

 印刷 

TypeScriptの関数 :: NJF Wiki

xpwiki:TypeScriptの関数

公式ページ[1]も参照のこと。

ページ内コンテンツ
  • 関数定義
  • 関数型
  • オプション引数とデフォルト引数
  • 可変引数
  • ラムダ式とthis
  • オーバーライド

関数定義 anchor.png[2] Edit [3]

TypeScript[4]の関数定義はJavaScript[5]と同様で型が指定できるだけである。

function testFunc(x:number,y:number):number{
    return x + y;
}

console.log(testFunc(2,4)); // => 6
Page Top

関数型 anchor.png[6] Edit [7]

無名関数を変数に入れるときには注意が必要となる。

var testFunc = function(x:number,y:number):number{
    return x + y;
}

testFunc = function(x:number,y:number,z:number):number{ //エラー
    return x + y + z;
}

ここで2度目の代入でエラーとなるのは、一度目の代入の型推論で、testFuncは二つのnumber型引数とnumber型戻り値を持つ型と判断されるためである。つまり、TypeScript[4]は引数や戻り値まで区別した関数の型を持つ。

そのような関数の型を明示することもできる。

var testFunc:(x:number,y:number)=>number = function(x:number,y:number):number{
    return x + y;
}

var test2Func:(x:number,y:number,z:number)=>number;

test2Func = function(x:number,y:number,z:number):number{
    return x + y + z;
}

これで無名関数をより厳密に扱うことができる。

また、このように明示的に関数の型を扱うときには、右辺の型は省略できる。

var testFunc:(x:number,y:number)=>number = function(x,y){
    return x + y;
}
Page Top

オプション引数とデフォルト引数 anchor.png[8] Edit [9]

関数の引数に「?」をつけると引数を省略できるオプション引数にできる。

function testFunc(x:number,y?:number){
    if(y){
        return x + y;
    }
    return x;
}

console.log(testFunc(1)); // => 1
console.log(testFunc(1,2)); // => 3

引数に「=」をつけるとデフォルト引数が指定できる。

function testFunc(x:number,y:number = 10){
    return x + y;
}

console.log(testFunc(1)); // => 11
console.log(testFunc(1,2)); // => 3
Page Top

可変引数 anchor.png[10] Edit [11]

「...」(ドット3つ)で引数の数を変更できる可変引数も使える。

function testFunc(...a:string[]):string{
    return a.join(",");
}

console.log(testFunc("one","two","three","four")) // => one,two,three,four
Page Top

ラムダ式とthis anchor.png[12] Edit [13]

ラムダ式は「=>」で定義する

console.log(((x:number,y:number)=>{return x + y;})(1,2)); // => 3

ラムダ式は「this」の扱いがより直観的になるというメリットがある。まず、

var wrapper = {
  x:2,  
  whatisx:function () {
      return function(){
          return this.x;
      }
  }
 };

var w = wrapper.whatisx();

console.log(w()); // => undefined

すると実行結果は「undefined」となる。これは実行時に「this」が定義時と異なるからである。これを

var wrapper = {
  x:2,  
  whatisx:function () {
      return () => {
          return this.x;
      }
  }
};

var w = wrapper.whatisx();

console.log(w()); // => 2

こちらは直感通り「2」となる。

Page Top

オーバーライド anchor.png[14] Edit [15]

関数の定義を並べると変数や戻り値の型や個数を変えるオーバーライドも可能。

function testFunc(x:number):number;
function testFunc(x:string):string;
function testFunc(x:number,y:number):number;

function testFunc(x:any,y:number = 1):any{
    if(typeof x == "number"){
        return x + y;
    }else if(typeof x == "string"){
        return "string:" + x;
    } 
}

console.log(testFunc(2)); // => 3
console.log(testFunc(2,4)); // => 6
console.log(testFunc("test")); // => "string:test"
testFunc(true); // => エラー

Last-modified: 2016-03-19 (土) 03:54:06 (JST) (2953d) by njf