LoginSignup
4
5

More than 5 years have passed since last update.

TypeScriptでRequire.jsのdefine()が使えなかった件

Last updated at Posted at 2014-07-23

TypeScriptもバージョン1.0が出たし使ってみるかーと思い作成しているものにRequire.jsでAMDに対応させようと思ったら詰まったときの備忘録です。

環境

  • TypeScript 1.0.1
  • Require.js 2.1.14
  • durandal 2.1.0

define()が使えない?

以下のjsのコードをTypeScriptに置き換えるときにこのまま突っ込んだらコンパイル時に「defineの引数がおかしいけど?」ってニュアンスのコンパイルエラーが発生。

define(['plugins/router', "durandal/app"], function (router, app) {
    return {
        router: router,

        search: function() {
            app.showMessage("Not Implemented", "Error");
        },

        activate: function () {
            router.map([
                { route: '', moduleId: 'hoge/huga', title: "hoge", nav: true }
            ]).buildNavigationModel();

            return router.activate();
        }
    };
});

import文を使えばいいらしい

調べたり、友人に訪ねて見ると
「require.jsを使うときは基本的にimport文を使え」とのこと

早速適応してみる。

/// <reference path="durandal.d.ts" />

import _router = require('plugins/router');
import _app = require('durandal/app');

class hoge {

    app = _app;
    router = _router;

    search() {
        this.app.showMessage("Not Implemented", "Error")
    }

    activate() {
        this.router.map([
            { route: '', moduleId: 'hoge/huga', title: "hoge", nav: true }
        ]).buildNavigationModel();
        return this.router.activate();
    }
}

export = hoge;

上記のソースにコンパイルオブション"-m amd"を追加するとコンパイルが通るらしい。
僕の環境ではGruntを使用しているので、grunt-typescriptのmoduleオブションに'amd'と付ける。

コンパイルしてみるとコンパイルは通りjsファイルは生成されたが、中身にはdefineが使われていなかった…
何か不足していることがあるのか調査が必要なようだ。

追記

解決したので追記します。

どうやらexportしてあげなきゃいけないらしい。
というわけで、正しく動作するように上記のソースを修正した。

ちなみにexport class hogeとやると、コンパイル後に別の動作になる。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5