HTML5テクニカルノート
TypeScript入門 11: 名前空間 ー namespace
- ID: FN1611001
- Technique: HTML5 / JavaScript
- Package: TypeScript 2.0
TypeScriptではクラスやインタフェースなどの宣言を名前空間に定められます。その考え方と使い方について、かいつまんでご説明します。なお、これまでは内部モジュールと称されていました。ECMAScript 2015の用語にしたがって名前空間(namespace
)と改められたもので、これからはモジュールは外部モジュールと呼ばれていた仕組みを指すことになります(「TypeScript入門 10: モジュール ー exportとimport」参照)。
01 namespaceで名前空間を定める
export
するクラスやインタフェースなどの宣言を名前空間に定めると、名前空間で分類することができ、また他のライブラリと名前の重複が防げます。export
宣言をつぎのように、キーワードnamespace
に添えた名前空間の{}
内に書きます。すると、「名前空間.宣言」のかたちで参照できます。
namespace 名前空間 {
export 宣言
}
つぎのコードの抜書きは、インタフェース(IPoint)を名前空間(geom)に定めました。
IPoint.tsnamespace geom { export interface IPoint { x: number; y: number; } }
インタフェースを実装するクラス(Point)は、つぎのように名前空間を添えて(geom.IPoint)参照します。また、import
は用いず、reference
タグでファイルの依存関係をコンパイラに示します(import
する場合には、名前空間をexport
しておかなければなりません)。
Point.ts/// <reference path="./IPoint.ts" /> export class Point implements geom.IPoint { constructor(public x: number = 0, public y: number = 0) { } }
つぎのテスト用のコードを試すと、クラス(Point)のインスタンスがつくられて、コンソールに表示されます。
sample.tsimport {Point} from './Point'; let point: Point = new Point(3, 4); console.log(point); // Point { x: 3, y: 4 }
02 複数のモジュールに同じ名前空間を与える
複数のモジュールに同じ名前空間を与えることもできます。そうすると、それらのモジュールを名前空間で分類してまとめられます。たとえば、前掲のインタフェース(IPoint)を実装したクラス(Point)も、つぎのように同じ名前空間(geom)に定めることができます。
Point.ts/// <reference path="./IPoint.ts" /> namespace geom { // export class Point implements geom.IPoint { export class Point implements IPoint { constructor(public x: number = 0, public y: number = 0) { }
すると、テスト用のコードもクラスに名前空間を添えて(geom.Point)参照することになります。
sample.ts/// <reference path="./Point.ts" /> let point: geom.Point = new geom.Point(3, 4); console.log(point);
なお、複数のモジュールに同じ名前空間を与えたときは、HTMLドキュメントに<script>
要素でJavaScript(JS)ファイルを読み込んで試してください。
<script src="IPoint.js" type="text/javascript" /script> <script src="Point.js" type="text/javascript" /script> <script src="sample.js" type="text/javascript" /script>
以下のコード001は、「TypeScript入門 10: モジュール ー exportとimport」コード001「3つのモジュールのexportとimportの指定」のモジュールに同じ名前空間(geom)を与えました。つぎのテスト用のコードを試すと、座標(1, √3)の原点からの距離(2)およびx軸の正方向となす角度(60)がコンソールに示されます。
/// <reference path="./Point.ts" /> /// <reference path="./Vector.ts" /> let point: geom.Vector = new geom.Vector(1, Math.sqrt(3)); console.log(point.length, point.angle * geom.Point.RAD_TO_DEG); 1.9999999999999998 59.99999999999999
コード001■3つのモジュールをひとつの名前空間に定める
IPoint.ts
namespace geom {
export interface IPoint {
x: number;
y: number;
}
}
/// <reference path="./IPoint.ts" />
namespace geom {
export class Point implements IPoint {
constructor(public x: number = 0, public y: number = 0) {
}
get length(): number {
var square: number = this.x * this.x + this.y * this.y;
return Math.sqrt(square);
}
set length(length: number) {
var point: IPoint = Point.getPolar(length, this.angle);
this.x = point.x;
this.y = point.y;
}
get angle(): number {
return Math.atan2(this.y, this.x);
}
set angle(angle: number) {
var point: IPoint = Point.getPolar(this.length, angle);
this.x = point.x;
this.y = point.y;
}
static get RAD_TO_DEG(): number {
return 180 / Math.PI;
}
static polar(length: number, angle: number): Point {
var point: IPoint = Point.getPolar(length, angle);
return new Point(point.x, point.y);
}
protected static getPolar(length: number, angle: number): IPoint {
var x: number = length * Math.cos(angle);
var y: number = length * Math.sin(angle);
return {x: x, y: y};
}
}
}
/// <reference path="./IPoint.ts" />
/// <reference path="./Point.ts" />
namespace geom {
export class Vector extends Point {
constructor(x: number = 0, y: number = 0) {
super(x, y);
}
scale(scaleX: number, scaleY?: number): void {
this.x *= scaleX;
this.y *= (isNaN(scaleY) ? scaleX : scaleY);
}
add(point: IPoint): void {
this.x += point.x;
this.y += point.y;
}
static polar(length: number, angle: number): Vector {
var point: IPoint = Point.getPolar(length, angle);
return new Vector(point.x, point.y);
}
}
}
- TypeScript: とにかくJavaScriptファイルをビルドしてみる
- TypeScript入門 01: Visual Studio CodeでTypeScriptのコードを書く
- TypeScript入門 02: publicとprivateおよびstatic
- TypeScript入門 03: クラスを継承して使う
- TypeScript入門 04: オブジェクト型リテラルとインタフェースを使う
- TypeScript入門 05: get/setアクセサをを使う
- TypeScript入門 06: メソッド引数のデフォルト値と省略および定数を定める
- TypeScript入門 07: ブロックスコープに変数を宣言する ー let
- TypeScript入門 08: 型の互換性
- TypeScript入門 09: アロー関数式
- TypeScript入門 10: モジュール ー exportとimport
- TypeScript入門 12: デコレータ(Decorator)を使う
作成者: 野中文雄
作成日: 2016年11月3日
Copyright © 2001-2017 Fumio Nonaka. All rights reserved.