yaakaito.org

【解決した】TypeScriptで複数ファイルに渡って同一moduleを定義したくてハマってる

Kuzu, TypeScript

解決した

どうも俺が0.8.3だと思っていたtscは0.8.0だった。 バージョンが古いなんて生易しいもんじゃねぇ、気がついたらnode環境がぶっ壊れていた、何を言っているかわからねーと思うが(ry npm listで出てくるtscと、パスが通ってるtscが違った。とりあえず直した、お騒がせしました。

本来下に書いてある

1
2
3
4
5
6
module A {
  class Hoge {
    // ...
  }
  export var hoge = new Hoge();
}

というのは、0.8.3時点でコンパイルでエラーになるようになっています、Hogeをexportしろ、とのことです。 で、Hogeの中でさらにインナークラスとか呼んでると、それもexportしなくちゃいけなくてヤダーなので、ほしいメソッドだけinterfaceにしました。

あと、referenceを反対にするとなんかおかしい問題は健在っぽいです。 いろいろ邪推してみましたが、それにあんまり意味はないので、issueにしてこようと思います。


 

こんにちは!うきょーです!分からないので誰か教えてください。 TypeScriptにmoduleって機能があるんですが、こいつでハマってる。

というのもこれって、

1
2
3
4
5
module A {
  class Hoge {
    // ...
  }
}

みたいにしておくと、

1
2
3
4
5
6
7
var A;
(function (A) {
    var Hoge = (function () {
        function Hoge() { }
        return Hoge;
    })();
})(A || (A = {}));

こうなるわけ。 で、moduleは複数のファイルに渡って同一のものを定義できるらしい。 実際そういう感じになっているし、そうなんだろう、分かる。

問題はこのモジュール内で変数定義しようとしたときに起こった。 例えばシングルトン的な感じでオブジェクトを外に出したいときに、

1
2
3
4
5
6
module A {
  class Hoge {
    // ...
  }
  export var hoge = new Hoge();
}

とすれば、

1
2
3
4
5
6
7
8
var A;
(function (A) {
    var Hoge = (function () {
        function Hoge() { }
        return Hoge;
    })();
    A.hoge = new Hoge();
})(A || (A = {}));

となる、ここまではよい。 もう一個同じmoduleを実装しているファイルがあるとする、

1
2
3
4
5
module A {
  class Fuga {
    // ...
  }
}

で、この二つを個別にコンパイルする分には何も起こらないし、普通に実行できてるっぽいんだけど、

1
2
3
4
5
6
7
8
/// <reference path="Fugaの方.ts" />

module A {
  class Hoge {
    // ...
  }
  export var hoge = new Hoge();
}

という風にreferenceすると export var hoge = new Hoge(); でHogeが見つからなくなる。真上にあるが・・・。

例えばこういう感じにしてビルドしてみても駄目。

1
2
/// <reference path="Fugaの方.ts" />
/// <reference path="Hogeの方.ts" />

なんだけど、順番を入れ替えると・・・

1
2
/// <reference path="Hogeの方.ts" />
/// <reference path="Fugaの方.ts" />

なんか知らんが通る。そんな参照で大丈夫か?

要するに、コンパイルするときに

1
2
3
4
5
6
7
module A {
  // ...
}

module A {
  // ...
}

という状態になると、二番目以降のmodule内で参照が死ぬ。 けどclassとかでプロパティに持つ分には大丈夫という謎状況。

バグなのかな、バグならバグでよいんだけど。

で、ここまで説明してきたんだけど、これエラーは出るけど、コンパイルはちゃんと通った跡がある、どっちやねん。

一番いい解説を頼む。

(誰も知らなさそうなら公式に投げてみようと思います。)