HTML5テクニカルノート
TypeScript入門 10: モジュール ー exportとimport
- ID: FN1610005
- Technique: HTML5 / JavaScript
- Package: TypeScript 2.0
TypeScriptはコードをモジュールというかたちで、ファイルに分けて開発できます。その考え方とそのときに用いるexport
とimport
の使い方について、かいつまんでご説明します。なお、これまでは外部モジュールと呼ばれていました。対する内部モジュールが名前空間(namespace
)に改められたため、単にモジュールとなりました。
01 exportとimport
ECMAScript 2015の仕様を受けて、TypeScriptはモジュールの仕組みを採り入れています。モジュールはファイルが単位となっていてそれぞれのスコープをもち、グローバルには展開されません。モジュールの中の変数や関数、インタフェースなどの宣言は、そのままであれば他から参照できないということです。モジュールの中で外から参照を許す宣言には、つぎのようにexport
の指定をします。
export 宣言
つぎのコードの抜書きは、TypeScriptファイル(IPoint.ts)に定めたインタフェース(IPoint)をexport
指定しています。
IPoint.tsexport interface IPoint { }
モジュールからexport
した宣言を別のモジュールで用いるには、import
の定めに、つぎのとおり{}
内にその宣言の識別子、from
の後にモジュールのファイルのパスを拡張子なしで与えます。
import {識別子} from ファイル名
つぎのコードの抜書きは前掲のexport
したインタフェースを実装するために、import
の指定にインターフェスの識別子(IPoint)とファイル(IPoint)のパスを定めました。加えて、クラス(Point)をexport
しています。
Point.tsimport {IPoint} from './IPoint'; export class Point implements IPoint { }
さらにつぎのコードは、前掲のexport
したクラス(Vector)をimport
して、サブクラス(Vector)に継承しています。
Vector.tsimport {Point} from './Point'; export class Vector extends Point { }
以上の構成にもとづいて、「TypeScript入門 06: メソッド引数のデフォルト値と省略および定数を定める」のコード001「メソッド引数にデフォルト値と省略時の処理および定数を定める」を3つのモジュールに分けたのが、つぎのコード001です。なお、インタフェースを型づけに用いているモジュール(Vecotor)は、そのimport
を加えています。
コード001■3つのモジュールのexportとimportの指定
IPoint.ts
export interface IPoint {
x: number;
y: number;
}
import {IPoint} from './IPoint';
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};
}
}
import {IPoint} from './IPoint';
import {Point} from './Point';
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);
}
}
02 exportとimportのいくつかのやり方
export
やimport
は、クラスやインタフェースだけでなく、変数や関数も対象にできます。つぎに抜書きしたコードではconst
定数(RAD_TO_DEG)をexport
しています。他のモジュールでimport
するときは、その識別子を与えればよいです。
import {IPoint} from './IPoint'; export const RAD_TO_DEG: number = 180 / Math.PI; export class Point implements IPoint { static get RAD_TO_DEG(): number { // return 180 / Math.PI; return RAD_TO_DEG; } }
また、export
を直接宣言に加えるのでなく、つぎのコードのように別の文で行うこともできます。その場合、識別子(Point)は{}
の中に与えます。そのとき、続けてつぎのようにas
を添えてexport
する別の識別子(VectorBase)が定められます。import
するときは、その新たな識別子を用います。
import {IPoint} from './IPoint'; // export class Point implements IPoint { class Point implements IPoint { } export {Point as VectorBase};
import
するときにも識別子は変えられます。{}
の中に与えた読み込む識別子(VectorBase)の後、つぎのようにas
に続けて新たな識別子(Point)を定めればよいです。
import {VectorBase as Point} from './Point'; export class Vector extends Point { }
- 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入門 11: 名前空間 ー namespace
- TypeScript入門 12: デコレータ(Decorator)を使う
作成者: 野中文雄
作成日: 2016年10月22日
Copyright © 2001-2017 Fumio Nonaka. All rights reserved.