2.0.3TypeScriptでは、変数や関数の引数、戻り値、プロパティあるいはメソッドに型づけできます。その型は予め備わっているデータだけでなく、独自に定めることもできます。型定義に用いられるオブジェクト型リテラルとインタフェースについてご説明します。クラスを継承して使う」で書いたコード003「サブクラスに静的メソッドを加えた」に手を加えてゆきます。メソッドの中に使い回せる処理があると、それを分けることがよくあります。スーパークラス(Point)の静的メソッド(polar())は、距離と角度からその座標がプロパティに納められたインスタンスを返します。この中の座標計算を、つぎのように別の静的メソッド(getPolar())に分けました。座標値はふたつ(xとy)あるので、オブジェクトリテラルで返します。したがって、戻り値はObjectで型づけしています。y};}}ところが、ビルドするとつぎのようなエラーが示されます。Objectクラスの中にはそのような(xとyという)プロパティがないからです。'Object'.切り分けた静的メソッド(getPolar())の戻り値をObjectで型づけされた変数(point)に納めようとするとき、互いの型が適合するかどうか確かめられます。変数の型としてanyを与えれば、この確認はされません。サブクラス(Vector)も併せてつぎのように型づけすれば、メソッドは正しく動きます。型定義をつくるanyで型づけすると、型が確認されません。型を与える意味が失われるということです。TypeScriptでは組み込みのデータ型になくても、型定義をつくることができます。y};}}この型づけであれば、与えられたプロパティがなかったり、そのデータ型が違っていれば、ビルドのときエラーが示されます。型に含まれていないプロパティやメソッドがあっても、それはエラーになりません。ここまでのTypeScriptコードをつぎにまとめました(コード001)。インタフェースを定めるオブジェクト型リテラルで定めた同じ型を、あちこちで使うようになったら、少し考えなければなりません。プロパティが加わったり、データ型が変わると、それらすべてを直さなければならなくなるからです。そのような場合に備えるには、インタフェースを用います。つぎのようにキーワードinterfaceでクラスと同じように名前を与え、プロパティやメソッドの型だけを宣言します。number;}インタフェースを定めれば、つぎのようにその名前の参照で型づけできます。前述の追加や変更も、インタフェース定義を書き替えるだけです。point.y);}}さらに、インタフェースはつぎのようにキーワードimplementsを用いて、クラス(Point)に定めることもできます。その場合、クラスはインタフェース(IPoint)が決めたプロパティをそのデータ型で備えなければなりません。インタフェースをメソッド(add())の引数の型に与えることもできます。型をクラスで定めると、そのクラスとサブクラスのインスタンス以外を渡せばエラーになります。インタフェースなら、プロパティとその型が合ってさえいれば、継承は問われません。point.y;}}たとえば、以下のテスト用のコードは、呼び出すメソッド(add())の引数にオブジェクトリテラルを渡しています。メソッドの引数がクラス(Point)で型づけされていたら、クラスのインスタンスではないため、つぎのようなエラーになります。インタフェース(IPoint)で与えていれば、プロパティと型が合っていれば動くのです。protected宣言によるアクセス制限スーパークラスのメソッドをサブクラスでも使いたい場合、private宣言はできません。publicでは、つぎのようにどこからでもクラス(Point)のメソッド(getPolar())が呼び出せてしまいます。1)以下のようにクラス(Point)のメソッド(getPolar())に宣言protectedを加えると、そのクラスとサブクラスからしか参照できなくなります。外から呼び出そうとすれば、つぎのようなエラーが示されます。ここまで書いたTypeScriptコードは以下にまとめました(コード002)。以下にサンプル001としてjsdo.itに書いたコードを掲げてあります。TypeScriptのバージョンを2.0.3に更新。