Namespaces

Last updated 2 months ago

名前空間は、JavaScriptで使用される次の一般的なパターンの便利な構文を提供します。

(function(something) {
something.foo = 123;
})(something || (something = {}))

基本的に、something || (something = {})は、無名関数function(something) {}が何かを既存オブジェクト(something ||部分)に追加するか、新しいオブジェクト( ||(something = {})の部分)を作って何かを追加することを可能にします。これが意味することは、このように何らかの分岐で分割された2つのブロックを持つことができるということです。

(function(something) {
something.foo = 123;
})(something || (something = {}))
console.log(something); // {foo:123}
(function(something) {
something.bar = 456;
})(something || (something = {}))
console.log(something); // {foo:123, bar:456}

これは、グローバルな名前空間を汚染しないようにJavaScriptでよく使われます。ファイルベースのモジュールでは、これを心配する必要はありませんが、このパターンは、それでも、一連の関数の論理グループ化(logical grouping)に役立ちます。そのため、TypeScriptは、namespaceキーワードを使ってグループ化する手段を提供します:

namespace Utility {
export function log(msg) {
console.log(msg);
}
export function error(msg) {
console.error(msg);
}
}
// usage
Utility.log('Call me');
Utility.error('maybe!');

namespaceキーワードは、先ほど見たのと同じJavaScriptを生成します:

(function (Utility) {
// Add stuff to Utility
})(Utility || (Utility = {}));

注意すべきことは、名前空間を入れ子にすることができるので、Utilityの下にMessaging名前空間を入れ子にするためにnamespace Utility.Messagingのようなことができるということです。

たいていのプロジェクトでは、簡単なデモと古いJavaScriptコードを移植するために、外部モジュールとnamespaceを使用することをオススメします。