TypeScript の module を勉強していたら名前空間という前提に素朴な疑問を抱いた話。

大規模 JavaScript 開発とかしてると、こんな風に名前空間を切ったりする。 とりあえず Backbone with Marionette を例に。

//namespace.js
var App = {
    View  = {},
    Model = {}
};

// model/hoge.js
App.Model.Hoge = new Backbone.Model.extend({
    // anything
});

// view/hoge.js
App.View.Hoge = new Marionette.ItemView.extend({
    model: App.Model.Hoge,
    // anything
});

これを TypeScript に書き直してみるとこうなる。

// model/hoge.ts
export module Oplux.Model {
    export class Login extends Backbone.Model {
        // anything
    }
}

//hogeView.ts
import HogeModel = require('../model/hoge');

export module App.View {
    export Hoge extends Marionette.ItemView<HogeModel.App.Model.Hoge>
}

ItemView の引数がひどく気持ち悪いことになった。 外部モジュールを HogeModel という名前で呼び出したので、HogeModel.Hoge になると思ったんだけど。

ちょっと待ってくれ。そもそも僕らは何のために「名前空間」とかいうもので切り始めたんだ。

// これじゃいかんのか?
// model/hoge.ts
class HogeModel extends Backbone.Model {
    // anything
} 

// view/hoge.ts
class HogeView extends Marionette.ItemView<HogeModel> {
    // anything
}

……。

人類が名前空間を手に入れた理由について学習する義務があるようだ。