#TypeScript 名前空間

ネームスペースは、関連するコードをまとめて整理する方法で、中国語では「名前空間」と訳されます。

これは ES モジュールの誕生に先立って、TypeScript 独自のモジュール形式として発明されました。ただし、ES モジュールの出現以来、名前空間の使用は正式に非推奨になりました。

基本的な使い方

ネームスペースはコンテナーの作成に使用され、すべての内部変数と関数はこのコンテナーで使用する必要があります。

名前空間ユーティリティ {
  関数 isString(値:任意) {
    戻り値の型 === '文字列';
  }

  // 正しい
  isString('はい');
}

Utils.isString('no'); // エラーレポート

上記の例では、関数 isString() は名前空間 Utils 内でのみ使用できます。外部で使用するとエラーが報告されます。

名前空間の外部で内部メンバーを使用する場合は、メンバーに「export」プレフィックスを追加して、メンバーが外部にエクスポートされることを示す必要があります。

名前空間ユーティリティ {
  エクスポート関数 log(msg:string) {
    コンソール.ログ(メッセージ);
  }
  エクスポート関数エラー(msg:string) {
    コンソール.エラー(メッセージ);
  }
}

Utility.log('電話してください');
Utility.error('たぶん!');

上記の例では、「export」プレフィックスが追加されている限り、内部メンバーを名前空間の外で使用できます。

コンパイルされた JavaScript コードは次のとおりです。

varユーティリティ;

(関数 (ユーティリティ) {
  関数ログ(メッセージ) {
    コンソール.ログ(メッセージ);
  }
  Utility.log = ログ;
  関数エラー(メッセージ) {
    コンソール.エラー(メッセージ);
  }
  Utility.error = エラー;
})(ユーティリティ || (ユーティリティ = {}));

上記のコードでは、名前空間「Utility」が JavaScript オブジェクトになり、「export」のすべての内部メンバーがオブジェクトの属性になります。

これは、名前空間がコンパイルされたコード内に保持される値になることを意味します。これは純粋な型コードではないので注意してください。

名前空間内で「import」コマンドを使用して外部メンバーを入力することもできます。これは、外部メンバーにエイリアスを与えることと同じです。外部メンバーの名前が長い場合、エイリアスを使用するとコードを簡素化できます。

名前空間ユーティリティ {
  エクスポート関数 isString(value:any) {
    戻り値の型 === '文字列';
  }
}

名前空間アプリ {
  インポート isString = Utils.isString;

  isString('はい');
  // と同等
  Utils.isString('yes');
}

上記の例では、import コマンドは名前空間 App で指定されており、外部メンバー Utils.isString のエイリアスは isString です。

「import」コマンドでは、名前空間の外にあるエイリアスを指定することもできます。

名前空間の形状 {
  名前空間ポリゴンのエクスポート {
    エクスポートクラス Triangle {}
    エクスポートクラス Square {}
  }
}

インポートポリゴン = Shapes.Polygons;

// new Shapes.Polygons.Square() と同等
let sq = 新しいポリゴン.Square();

上記の例では、「import」コマンドは、「Shapes.Polygons」のエイリアスを名前空間「Shapes」の外側の「polygons」として指定しています。

名前空間は入れ子にすることができます。

名前空間ユーティリティ {
  名前空間のエクスポート メッセージング {
    エクスポート関数 log(msg:string) {
      コンソール.ログ(メッセージ);
    }
  }
}

Utils.Messaging.log('hello') // "こんにちは"

上の例では、名前空間「Utils」内に名前空間「Messaging」もあります。 Messaging を外部で使用したい場合は、その前に export コマンドを追加する必要があることに注意してください。

ネストされた名前空間を使用する場合は、「Utils.Messaging.log()」などの最も外側のレベルから参照する必要があります。

名前空間にはリテラル コードだけでなく型コードも含めることができます。

名前空間 N {
  エクスポート インターフェース MyInterface{}
  クラス MyClass をエクスポート{}
}

上記のコードでは、コマンド スペース「N」はクラスをエクスポートするだけでなく、インターフェイスもエクスポートします。どちらもタイプとして使用できます。

名前空間とモジュールの機能は一貫しており、関連するコードをまとめて外部にインターフェイスを出力します。違いは、ファイルは 1 つのモジュールのみを持つことができますが、複数の名前空間を持つことができることです。モジュールは名前空間を置き換えることができ、JavaScript の標準構文であるため、コンパイルや変換を必要としないため、常に名前空間の代わりにモジュールを使用することをお勧めします。

名前空間コードが別のファイルに配置されている場合、ファイルをインポートするにはトリプルスラッシュ構文が必要です。

/// <参照パス = "SomeFileName.ts" />

名前空間の出力

名前空間自体は、他のファイルで使用するために「export」コマンドを使用して出力することもできます。

// 形状.ts
名前空間の形状をエクスポート {
  エクスポートクラス Triangle {
    // ...
  }
  エクスポートクラス Square {
    // ...
  }
}

上の例はファイル shapes.ts で、export コマンドを使用して名前空間 Shapes を出力します。

他のスクリプト ファイルは、「import」コマンドを使用してこの名前空間をロードします。

// 書き方その1
import { Shapes } from './shapes';
let t = new Shapes.Triangle();

//書き方2
* を「./shapes」からシェイプとしてインポートします。
let t = 新しいシェイプ.Shapes.Triangle();

ただし、より良いアプローチは、モジュールを使用し、その出力と入力を使用することです。

// 形状.ts
エクスポートクラス Triangle {
  /* ... */
}
エクスポートクラス Square {
  /* ... */
}

//shapeConsumer.ts
* を「./shapes」からシェイプとしてインポートします。
let t = 新しいシェイプ.Triangle();

上記の例では、モジュールの出力と入力を使用して前の例が書き直されています。

名前空間のマージ

同じ名前を持つ複数の名前空間は、インターフェイスと同様に自動的にマージされます。

名前空間 動物 {
  エクスポートクラス Cat {}
}
名前空間 動物 {
  エクスポートインターフェイス Legged {
    脚の数: 数値;
  }
  エクスポートクラス Dog {}
}

// と同等
名前空間 動物 {
  エクスポートインターフェイス Legged {
    脚の数: 数値;
  }
  エクスポートクラス Cat {}
  エクスポートクラス Dog {}
}

この目的は、同じ名前の名前空間が異なるファイルに分散している場合、TypeScript が最終的にそれらをマージすることです。これにより、他の人のコードを拡張することが容易になります。

ネームスペースをマージする場合、ネームスペース内の非エクスポート メンバーはマージされませんが、それらはそれぞれのネームスペースでのみ使用できます。

名前空間 N {
  定数 a = 0;

  エクスポート関数 foo() {
    console.log(a); // 正しい
  }
}

名前空間 N {
  エクスポート関数 bar() {
    foo(); // 正しい
    console.log(a); // エラーレポート
  }
}

上の例では、変数 a は最初の名前空間 N の非外部メンバーであり、最初の名前空間でのみ使用できます。

名前空間は同じ名前の関数とマージすることもできますが、同じ名前の関数は名前空間の前に宣言する必要があります。これは、関数オブジェクトが最初に作成され、その後、同じ名前のネームスペースが関数オブジェクトに追加の属性を追加することと同等であることを保証するために行われます。

関数 f() {
  f.version を返します。
}

名前空間 f {
  エクスポート定数バージョン = '1.0';
}

f() // '1.0'
f.version // '1.0'

上記の例では、関数 f() が名前空間 f とマージされます。これは、関数オブジェクト f に属性を追加する名前空間と同等です。

名前空間は同じ名前のクラスとマージすることもでき、同じ理由でクラスは名前空間の前に宣言する必要があります。

クラスC {
  foo = 1;
}

名前空間 C {
  エクスポート定数バー = 2;
}

C.バー // 2

上記の例では、名前空間 C が静的属性 bar をクラス C に追加します。

名前空間は、同じ名前の列挙型とマージすることもできます。

列挙型 E {
  あ、
  B、
  C、
}

名前空間 E {
  エクスポート関数 foo() {
    コンソール.ログ(EC);
  }
}

E.foo() // 2

上の例では、名前空間 E は、列挙型 Efoo() メソッドを追加します。

Enum メンバーと名前空間からエクスポートされたメンバーには同じ名前を付けることはできないことに注意してください。

列挙型 E {
  A, // エラーを報告する
  B、
}

名前空間 E {
  エクスポート関数 A() {} // エラーを報告する
}

上記の例では、同じ名前の Enum と名前空間に同じ名前のメンバーがあり、エラーが報告されます。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0