8

Typescript は、次のコードのコンパイラ エラーを与えません。

var b = a + 10; // Why no compilation error here

var a = 10;

alert(b.toString());

この時点まで var a を宣言または初期化していないため、最初の行はエラーになると予想されます。

2 行目を削除すると、コンパイラ エラーが発生します。

JavaScript で有効であることはわかっていますが、TypeScript でコンパイル エラーまたは警告が表示されることを期待しています。

4

2 に答える 2

11

巻き上げ動作は混乱を招く可能性があるためです。あなたのコードは実際に意味します。

var a, b

b = a + 10
a = 10

alert(b.toString())

巻き上げを許可する正当な理由がありますが、それらには関係ありませんがvarfunction後で宣言された関数を呼び出すことができます。

alert(identity(i))

function identity(i) {
    return i
}

この場合、alert後で宣言された関数の結果を使用します。巻き上げ動作のおかげで、それは機能します。

このケースには警告が必要であることに同意しますが (エラーではなく、TypeScript は JavaScript との互換性を望んでいます)、TypeScript が現在それを認識していないようです。TypeScriptのすべての変数には、変数の存続期間中に変更できない型があり、あなたの場合aは型です(型を暗黙的に設定するnumberため、割り当て前に使用することは認識されません)。varTypeScript は、その宣言のために、数値でなくても数値であると想定します。

これを TypeScript のバグとして報告することをお勧めします。

于 2013-06-24T11:04:45.970 に答える
6

コードが次のものと同等であることを理解していると仮定します。

var a, b
b = a + 10
a = 10
alert(b.toString())

これは次と同等です。

var a = undefined, b = undefined
b = a + 10
a = 10
alert(b.toString())

許可する必要がある理由は、未定義が、割り当てて読み取ることができる変数の有効な値であるためです。

この機能が役立つさまざまなユースケースがあります。たとえば、typescript で使用されるモジュール パターン:

module x{
    export var foo; 
}

この事実を利用する JavaScript コードを生成します。

var x;
(function (x) {
    x.foo;
})(x || (x = {})); //x was never assigned but used in "x ||" part

これは、JavaScript の後方互換性のために TypeScript に残されています (便利であることは言うまでもありません)。

これは純粋に TypeScript のユースケースです。おそらく、 undefined を関数呼び出しに渡したいと思うでしょう (これは有効な typescript です):

var a:number = undefined; // same as simply "var a" 
console.log(a);

TypeScript 開発者は、基礎となる JavaScript 言語の機能を必要としていると想定されています。

これは、割り当て前の読み取りが無効な言語 (C# など) には当てはまりません。C# では、割り当てられていない変数には意味がありません。JavaScript ではそうです。したがって、TypeScriptこれを許可する必要があります。

于 2013-06-24T11:28:46.040 に答える