12

TypeScript の同じモジュールに追加された 2 つ以上のファイルに 2 つ以上のクラスを何らかの方法で追加できるかどうか疑問に思っています。このようなもの:

//src/gui/uielement.ts
module mylib {
    module gui {
        export interface UIElement {
            public draw() : void;
        }
    }
}

//src/gui/button.ts
///<reference path='uielement.ts'/>
module mylib {
    module gui {
        export class Button implements UIElement {
            constructor(public str : string) { }
            draw() : void { }
        }
    }
}

おそらく数十の GUI クラスが存在するため、それらすべてを同じファイルに含めることはできません。そして、私のクラスはすべて「mylib」モジュールになります。しかし、どうすればいいですか?

module mylib {...}が関数に変換される場合、mylibすべてのファイル内のすべてのブロックのすべてのコンテンツが同じ関数内に含まれている必要があります。

これはまったく可能ですか?

コンパイルすると、次のようになります。

$ tsc src/gui/button.ts 
src/gui/button.ts(4,39): The name 'UIElement' does not exist in the current scope
4

1 に答える 1

23

これはまさにそれがどのように機能するかです!生成された JavaScript コードを見ると、オブジェクトを受け入れる無名関数として「モジュール オブジェクト」が追加されています。

var mylib;
(function (mylib) {
    var Button = (function () {
        function Button(x) {
            this.x = x;
        }
        return Button;
    })();
    mylib.Button = Button;    
})(mylib || (mylib = {}));

最後の行 ( })(mylib || (mylib = {}));) を見るとmylib = {}、既存の変数が false (または null のように false と評価されるもの) の場合にのみ、新しい ojbect ( ) をインスタンス化することがわかります。そうすれば、同じ名前のすべての「モジュール」が同じオブジェクトにマージされます。

したがって、内部モジュールは相互に拡張されます。ネストされたモジュールがどうなるかはまだよくわかっていません。

更新:ネストされたモジュール構文を使用せずにドット構文に変更すると、コードが機能します。例えば:

module mylib.gui {
}

それ以外の

module mylib {
    module gui {
    }
}

なぜこれが起こっているのかを調査しようと思います.仕様を読んだ限りでは、両方の方法が等しいはずです.

更新: ネストされた参照モジュールがエクスポート済みとしてマークされている場合、機能します:

module mylib {
    export module gui {
    }
}
于 2012-10-20T19:31:31.830 に答える