コンパニオンオブジェクトパターン
TypeScriptでは値と型に同名を与えてその両方を区別なく使うことができるテクニックがあります。これをコンパニオンオブジェクトと呼びます。
これは、クラスを作るほどでもなけどそれっぽいファクトリーメソッドとオブジェクトが欲しいときに重宝します。
コンパニオンオブジェクト (Companion Object)
次の例は長方形 (Rectangle) を作成するためのメソッドfrom()
をもつオブジェクトRectangle
とその生成されるオブジェクトの型Rectangle
です。これらの名称は衝突することなく定義ができ、外部から呼び出したときは同名で使用できます。
次の型と値 (ファクトリーメソッドを持つオブジェクト) は同じファイルrectangle.ts
に存在するとします。
ts
export typeRectangle = {height : number;width : number;};export constRectangle = {from (height : number,width : number):Rectangle {return {height ,width ,};},};
ts
export typeRectangle = {height : number;width : number;};export constRectangle = {from (height : number,width : number):Rectangle {return {height ,width ,};},};
値も型も同名で定義します。これを外部から import してみます。
ts
import {Rectangle } from "./rectangle";constrec :Rectangle =Rectangle .from (1, 3);console .log (rec .height );console .log (rec .width );
ts
import {Rectangle } from "./rectangle";constrec :Rectangle =Rectangle .from (1, 3);console .log (rec .height );console .log (rec .width );
このように import の部分はRectangle
のみとなり見通しもつきやすいという特徴があります。ちなみにRectangle.from()
のRectangleが値でありconst rec: Rectangle
のRectangleが型です。このようにTypeScriptでは同名の値と型を同時に使うことができます。