2

このコードを考えてみましょう:

var a = [];

for (var i in a)
  /* nothing */;

var i : number;

i = 9;

これをコンパイルすると、コンパイラは最後の行について「「数値」を「文字列」に変換できません」と文句を言います。

おそらくfor..inループは文字列として作成されますが、コンパイラが文句を言うまで待つのではなく、i文句を言うことを期待していました。var i : numberi = 9

に変更var i : numberしてvar i : number = 8も、コンパイラはに達するまで文句を言いませんi = 9

これはバグですか、それとも何かが足りませんか?

4

2 に答える 2

3

最初に変数を宣言した場合は、予測した場所に警告が表示されます。たとえば、この行をコードの先頭に配置した場合:

var i: string;

次の行に重複する識別子があることを警告します。

var i: number;

forステートメントで宣言するときに重複する識別子を検出しないためi、おそらくそうする必要があります。そのため、間違ったタイプの値を割り当てると、別のエラーが発生します。

ここで最も重要なエラーである重複識別子の警告が必要な場合は、 http://typescript.codeplex.com/にバグを記録するのが最善の策です。

于 2013-02-28T14:10:29.460 に答える
0

これはバグではありません。何が起こっているのかを理解するには、JavaScriptがどのように動作するかを理解する必要があります。特に、巻き上げに関する領域ではそうです。基本的に、上記のコードは次のものと同じです。

var a = [],
    i;

for (i in a)
  /* nothing */;

i = 9;

forステートメントで最初に検出されたためi、その型は文字列になりつつあります。for (key: string in someVar) { }

JavaScriptでの巻き上げとスコープについて説明している記事は次のとおりです 。http ://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

于 2013-02-28T14:11:45.510 に答える