2

TypeScript ファイルに次のコードがあります。

define('myModule', [], function () {

    var self = {
        init: function () {
            doSomething();
        }
    };

    var dayNames:string[] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];

    function doSomething () {
        var current = new Date();
        var day = dayNames[current.getDay()];
    }

    return self;
});

ただし、Visual Studio 2012/Web Essentials 2012 ではコンパイルできません。

コンパイル エラー。詳細については、エラー リストを参照してください tsc.js(19148, 13) Microsoft JScript ランタイム エラー: プロパティ 'elementType' の値を取得できません: オブジェクトが null または未定義です

奇妙なことに、同じコードがTypeScript プレイグラウンドで正常にコンパイルされるようです。C:\Program Files (x86)\Microsoft SDKs\TypeScript\tsc.jsのバージョンを確認しましたが、これは CodePlex (0.8.3.0) の最新バージョンです。

次の行をコメントアウトすると、正常にコンパイルされます。

var day = dayNames[current.getDay()];

また、次のコード ブロックを単独で使用しても問題なくコンパイルされます。

var dayNames:string[] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];

function doSomething () {
    var current = new Date();
    var day = dayNames[current.getDay()];
}

それで、私は何を間違っていますか?

4

2 に答える 2

3

dayNames宣言の前にの定義を移動すると、正常にコンパイルされるため、が定義される前にself呼び出しているように見えます。doSomething()dayNames

なぜこれが当てはまるのか、なぜそれがより有用なコンパイラエラーを生成しないのか、私にはわかりません.TypeScriptがまだアルファコードであるためです. CodePlexの問題として提起することをお勧めします。

私はこのような他のいくつかの例に気づきました。たとえば、同じファイル内に別のクラスを拡張するクラスがある場合、基本クラスを最初に配置する必要があります。そうしないと、コンパイラが失敗することがあります。

于 2013-04-30T11:09:05.340 に答える