2.2TypeScript公式Handbook「Functions」をもとにした解説です。関数はJavaScriptで処理を部品分けして組み立てたり、あるいはクラスを定める役割も果たします。6)の仕様も採り入れて、関数の型づけや参照などについて起こりがちな問題を確かめたり、コードを簡単にわかりやすく書くための機能が備わっています。関数を定める関数はfunctionキーワードのあとに名前(識別子)をつけて定めます。0)からの距離を三平方の定理により求めて返します。関数の引数と戻り値には、コロン(:)を添えて型づけしました(いずれもnumber)。関数にふたつの引数を与えてつぎのように呼び出せば戻り値が得られます。呼び出しは、関数を定める前でも構いません。Math.sqrt(square);}関数に名前をつけず、つぎのように変数(getLength)に納めて呼び出すこともできます。この場合、関数は代入式で定められますので、呼び出しは式よりあとでなければなりません。5関数本体から、外の変数を参照することもできます。このような処理は注意して使ったほうがよいでしょう。関数で型づけする変数に関数の型を与えることもできます。決めるのは引数と戻り値です。引数は関数を定めるときと同じようにコロン(:)で型づけします。戻り値の型はアロー=>のあとに添えます。戻り値がないときは、型にvoidを定めなければなりません。Math.sqrt(square);};引数は数とそれぞれの型だけが決まり、名前は問いません。start;}TypeScriptは型を推論で定めます。numberで型づけした引数を数値演算して返せば、戻り値の型が省かれていてもnumberとされるのです。型を決めていない変数に関数を納めると、その関数の型が与えられます。すると、変数に型の合わない関数を代入したときはエラーになります。変数が関数で型づけされていれば、引数や戻り値に型が与えられていなくても、変数に応じて定められます。関数を呼び出すときは、定められた引数が渡されなければなりません。引数の数が足りなくても、多くてもエラーを示します。5引数のあとに?をつけると、その値は関数の呼び出しのとき省くことができます。undefinedまたはnullの値は、渡されなかったものと扱われます。省略できる引数は必須の引数のあとに置かなければ、対応が正しく決められません。引数の数があらかじめ定まらないからです。つぎの関数(getLength())は、渡した引数が2次元(ふたつ)でも3次元(3つ)でも、原点からの距離を求めて返します[*1]。2引数に=演算子で値を代入すると、デフォルト値の定めになります。引数が渡されない(またはundefinedかnullの)ときは、その値が用いられるのです。つぎの関数(getAngle())は、はじめのふたつの引数(xとy)の2次元平面座標がx軸正方向となす角度を返します。第3引数にtrueを渡せば、戻り値は度数角です。デフォルト値はfalseで、ラジアン値としました。59.99999999999999引数のデフォルト値は、省略できる引数の替わりにも使えます。関数としての型づけで引数に?を用いることもでき、デフォルト値が定められた引数とは型が合います。angle;};デフォルト値を与えた引数は、省略できる引数とは違い、あらかじめ数が決まります。必須の引数より前に置いても、undefinedかnullを渡して数さえ合わせれば、関数は呼び出せます。誤りを引き起こしやすくなるので、注意しましょう。z)の原点からの距離は、各座標の平方和を開いて得られます(図001)。値を配列にまとめる引数TypeScriptでは、関数に数の決まらない引数がひとつにまとめて定められます。parameters)です。省略記号(...)のあとに引数を加えると、それ以降のすべての引数値を納めた配列が与えられます。残余引数は最後にひとつしか置けません。つぎの関数(callFunction())は、第1引数の関数(func)に第2引数以降(args)を渡して呼び出し、結果を返します。59.99999999999999残余引数は、関数としての型づけに用いることもできます。対応する引数はなくても空の配列が渡されるので、エラーにはなりません。0JavaScriptで関数を呼び出すと、すべての引数値を配列のようにまとめたargumentsオブジェクトが本体の中でつくられます。残余引数と違うのはつぎの点です。argumentsオブジェクトは関数に渡されたすべての引数値を納めます。残余引数は定められた位置以降の引数値を含む配列です。残余引数はArrayインスタンスです。argumentsオブジェクトは配列のように値が取り出せるものの、Arrayメソッドがすべて使えるわけではありません。argumentsオブジェクトは配列にないプロパティなどの機能を備えます。関数本体のthis参照JavaScriptにおける関数本体から参照したthisは、呼び出されるときに関連づけられたオブジェクトになります。オブジェクトのメソッドとして呼び出されれば、関数本体のthisが参照するのはそのオブジェクトです。つぎのオブジェクト(deck)のメソッド(createCardPicker())を呼び出すと、52枚のカードから1枚を決めて、そのマークと数字を変数(pickedCard)にオブジェクトで返します。数字は0から12までの整数になります。deck.createCardPicker();けれど、関数が新たな関数を返した場合、戻り値の関数はまだ呼び出されていません。this参照は呼び出されるときに決まるので、つぎのコードでは戻り値の関数(cardPicker())を呼び出したグローバル空間が対象となり、もとのオブジェクト(deck)ではなくなります。したがって、オブジェクトのプロパティが見つからないのでエラーになってしまうのです。アロー関数式」参照)。つぎのオブジェクト(deck)のメソッド(createCardPicker())から返された関数(cardPicker())を呼び出すと、52枚のカードから1枚を決めて、マークと数字を変数(pickedCard)にオブジェクトで返します。cardPicker();ただし、関数を返すオブジェクト(deck)のメソッド(createCardPicker())もアロー関数式にしてしまうと、this参照が戻り値の関数を変数(cardPicker)に定めたグローバル空間になってしまいます。cardPicker();関数のthis参照がグローバル空間に定められてしまう問題は、コールバックでも起こります。この場合も、アロー関数式を正しく用いることで避けられるでしょう。thisを引数で型づけるTypeScriptには、noImplicitThisのフラグがあります。値をtrueに定めると、thisは型づけしなければなりません(デフォルト値はfalse)。true}}前項で試したつぎのコードは、thisの型が決まっていないためエラーになります(図002)。};};}};図002■thisが型づけされていないというエラーthisは関数の第1引数で型を与えます。つぎのようにanyで型づけすれば、取りあえずエラーは消えるはずです。エラーなし};}};noImplicitThisをtrueにしたからには、インタフェース(interface)できちんと型を決めましょう。つぎのように定めれば、メソッド(createCardPicker())はインタフェースどおりのオブジェクト(Deck)をthis参照して呼び出さなければなりません。};};}};インタフェースにそぐわないオブジェクトからメソッドを呼び出そうとすれば、thisが型と合わないというエラーを起こします。すれば、this参照の問題は防げるでしょう。関数を多重定義する関数に渡す引数や型によって処理を変えることは「多重定義」(オーバーロード)と呼ばれます。引数を省略可能にしたり、anyで型づけすれば処理はできるでしょう。型を確かめる機能が失われてしまいます[*2]。13};}TypeScriptでは、関数の実装の前にそれとは分けてfunctionキーワードで型が定められます。実装は引数の型をanyとしていても、前に与えられた型づけのいずれにも合わなければエラーになるのです。つぎの関数(pickCard())は、引数に0から51までの整数を渡すとそのカード、引数がなければ52枚中ランダムな1枚、0から51までの整数の配列を渡せばその中の1枚をオブジェクトで返します。関数のオーバーロードでは、引数によって戻り値の型を変えることもできます(「Functions」の「Overloads」に掲げられたサンプルコード参照)。クラスのメソッドやコンストラクタもつぎのようにオーバーロードは可能です。このコード例でしたら、Union型|と型変換のas構文を使って、つぎのように書き替えれば型が確かめられます。オーバーロードの構文を用いたほうが、引数によって処理を変えることがはっきりして、スクリプトも書きやすいでしょう。