[typescript]moduleの取り扱い


typescriptではモジュールを記述することで変数の影響を局所化することができます。
javaでいうところの名前空間みたいなものです。

/**
 * モジュールを使用することで名前空間を定義できる
 */
module modA {
    export var a:string;
    var b:string; //exportを記述しないものは外部から参照できない
}

module modB {
    export var a:string;
}

modA.a = "Hello!"; //modA.bは参照できない
modB.a = "MyModule!";

console.log(modA.a);
console.log(modB.a);

/**
 * 多階層のモジュールを定義する場合はこのようにモジュール宣言を入れ子にする
 */
module mobC {
    /**
     * ネストする場合は内側のmodule宣言にもexportが必要なことに注意する
     */
    export module D {
        export function func():void {
            console.log("foo");
        }
    }
}

mobC.D.func();

/**
 * 多階層のモジュールを定義する場合のもう一つの方法。
 * ドットでつないで指定
 */
module modD.E {
    /**
     * 外部のモジュールを読みこむ場合はimport文を使用する
     * 読み込んだモジュールはimportで宣言した変数名で使用できる
     */
    import fuga=mobC.D;
    export function doImport():void {
        fuga.func();
    }

    export function func():void {
        console.log("bar");
    }
}

modD.E.func();
modD.E.doImport();

(2016/5/9追記)
Typescript1.5.3から、新たに言語仕様namespaceキーワードが追加されました。

// 1.5.3以前
module modA {
    export var a:string;
    var b:string; //exportを記述しないものは外部から参照できない
}

//1.5.3以降からこのような書き方ができるようになる
namespace modA {
    export var a:string;
    var b:string; //exportを記述しないものは外部から参照できない
}

ES2015のmoduleとの混同を避ける目的があるようです。

参考:http://qiita.com/vvakame/items/9b9fde6c71aae6a824c0