デフォルトでは、新しいTypeScriptファイルにコードを入力すると、コードはグローバル名前空間(global namespace)に入ります。デモとして、foo.ts
ファイルを考えてみましょう:
var foo = 123;
同じプロジェクトで新しいファイルbar.ts
を作成すると、TypeScriptの型システムは、変数foo
をグローバルに利用することを許容します:
var bar = foo; // allowed
言うまでもありませんが、グローバル名前空間を使うとコードで名前が競合する危険があります。次のファイルモジュール(File Module)を使用することをお勧めします。
external modulesとも呼ばれます。TypeScriptファイルのルートレベルにimport
またはexport
が存在する場合、そのファイル内にローカルスコープ(local scope)が作成されます。したがって、以前のfoo.ts
を次のように変更した場合(export
に注目):
export var foo = 123;
我々はもはやグローバル名前空間のfoo
を持っていません。これは、次のように新しいファイル bar.ts
を作成することで実証できます:
var bar = foo; // ERROR: "cannot find name 'foo'"
bar.ts
でfoo.ts
のものを使いたい場合明示的にインポートする必要があります。これを以下の更新版のbar.ts
に示します:
import { foo } from "./foo";
var bar = foo; // allowed
bar.ts
でimport
を使うと、他のファイルから取り込むことができるだけでなく、ファイルbar.ts
をモジュールとして認識するので、bar.ts
での宣言はグローバル名前空間を汚染しません。
外部モジュールを使用するTypeScriptファイルのJavaScriptへのコンパイルは、module
というコンパイラフラグが必要です。