TypeScriptの宣言空間とその不満

最近TypeScriptの型を触っていてハマったあたりのまとめ。だいたい仕様書に書いてあるとおりなので、すでに仕様書を読破している諸兄にはこの記事は必要ないです。

宣言空間 (declaration space) とは

宣言空間というのは、同一宣言空間で同じ名前が複数存在するとエラーになるような空間のこと。 TypeScriptには大きく分けて3つの宣言空間 (declaration space) がある *1

  1. 変数 (for variables) またはメンバー (for members)*2*3
  2. 型 (for named types)
  3. 名前空間 (for namespaces)

どういうことかというと、TypeScriptでは次のコードがエラーにならない。

var M = 0; // 変数宣言空間
interface M {} // 型宣言空間
module M {} // 名前空間宣言空間

変数とinterfaceとmoduleは別々の宣言空間に宣言されるためコンフリクトしない。

*1:詳細はSpecification 2.3 Declarationsを参照

*2:このグループは仕様書ではまとめられていない(と思う)けど、自分の理解としては型と名前空間とは違うそれ以外のJavaScript空間に存在する宣言空間としてひとまとめにした。

*3:クラスのメンバーにはinstanceメンバーとstaticメンバーがある。

続きを読む