海未「ではモジュールの話をしましょう。ことり、イベントの件は、今は、その」
ことり「うん、後でゆっくりね♪」
海未「モジュールと言いましたが、現在はmodule
ではなくnamespace
というキーワードが使われます。いわゆる名前空間ですね」
海未「名前空間の概念は、Node.jsの時に出てきたモジュールと同じです。書き方が少しだけ異なるので、そこだけ覚えれば大丈夫でしょう」
ことり「Node.jsだとmodule.exports = function() {...}
みたいにしてたよね」
海未「モジュールには内部モジュールと外部モジュールがあります。そういえばNode.jsの時には外部モジュール、つまり他のファイルに対してクラスや関数を公開するものしか説明しませんでした」
海未「内部モジュールから説明しますね。これは1つのファイルの中で、クラスや関数をグループ分けするものです」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
namespace Student { export class Idol { constructor( public name: string, private age: number, public school: string ) {} } export function study(): void { console.log('お勉強そこそこだって'); } function play(): void { console.log('あれもこれもしたい'); } } namespace Tarent { export class Idol { constructor( public name: string, private age: number, public production: string ) {} } } var honoka: Student.Idol= new Student.Idol('Honoka Kosaka', 16, 'Otonokizaka High'); var uzuki: Tarent.Idol = new Tarent.Idol('Uzuki Shimamura', 17, '346Pro'); Student.study(); Student.play(); // error |
海未「グローバルな名前空間にクラスがたくさんできるとわかりにくいですし、名前の衝突などの問題も出てきますから、このようにカテゴリ別にモジュールにまとめるとすっきりしますね」
穂乃果「同じIdolって名前のクラスでも、名前空間が違えば違うクラスなんだね」
海未「はい。Student.Idol
とTarent.Idol
は共存できますね」
ことり「きっとexport
したクラスとか関数だけが外から見えるんだよね。クラスのprivate
とかもそうだけど、見えるところと見えないところをちゃんと管理できるんだ」
海未「このアクセス制御も、JavaScriptが抱えている問題の1つですから。これで意図しないAPIを呼び出されたりする心配が減りますね」
ことり「でもことりには、海未ちゃんのprivate
はちゃんと見えるよ♪ ばーん」
海未「そ、そんなC++のfriend
みたいなことがあるはずが・・・」
穂乃果(ほんとに見えてそうで怖いよね・・・)
海未「外部モジュールはNode.jsの時に説明したように、ファイルの外部へ機能を公開するモジュールです」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
export class Idol { constructor( public name: string, private age: number, public school: string ) {} } export function study(): void { console.log('お勉強そこそこだって'); } function play(): void { console.log('あれもこれもしたい'); } |
海未「モジュール側はこのようになります。これを利用する側は」
1 2 3 4 5 |
import student = require('studentlib'); var honoka: student.Idol = new student.Idol('Honoka Kosaka', 16, 'Otonokizaka High'); student.play(); // error |
海未「このように呼び出せます。呼び出す側はNode.jsとほぼ同じですね」
穂乃果「これなら難しくないね」
海未「1つ注意点なのですが、外部モジュールを使う場合は、コンパイル時にNode.jsであればtsc --module commonjs app.ts
、ブラウザであればtsc --module amd app.ts
のようにオプション付きでコンパイルする必要があります」
海未「これはNode.jsではそのまま動作しますが、ブラウザ上で動作させる場合はRequire.jsなどのライブラリが必要になりますから、そのあたりは各自調べてみてください」
海未「次回はJavaScriptにはなかったインターフェイスという機能を見てみましょう」
ことり「じゃ、海未ちゃん、行こっか」
海未「・・・はい」
穂乃果「う、海未ちゃん!生きて帰ってきてねっ!」