2017-11-14 6 views
-1

私は、次のコードを持っている:間違いだったと私は活字体がエラーとして報告する期待の「if」内側「せ」を使用して上記のコードでなぜエラーを報告する代わりに新しい変数を作成するのですか?

let answer: SomeType = new SomeType(); 
    ...some code... 
    if(something) 
    { 
     let answer = new SomeType(); 
    } 

を。代わりに、Typescriptはこの行をJavaスクリプトにコンパイルしました。 var answer_1 = new SomeType(); は、基本的に独自の新しい変数を生成しました。

これが期待どおりの動作ですか?私はそれがバグだと思う。これは私がvarの代わりにletを使用している理由です。予想される動作の場合、これをエラーとして報告するコンパイラオプションがありますか?

私は、Visual Studio 2017

おかげ

+0

これは、明示的に 'let'キーワードと同じです。 https://basarat.gitbooks.io/typescript/content/docs/let.html – Amy

答えて

1

この予想される動作ですを使用していますか?

はい。

なぜletvarと異なるのですか。 the difference between var and let in the documentationについて詳しく読むことができます。

抜粋:変数を聞かせて使用して宣言された場合

、それはいくつかのスコープ語彙やブロック・スコープと呼ぶものを使用します。スコープが含まれている関数にリークするvarで宣言された変数とは異なり、ブロックスコープ変数は最も近い格納ブロックまたはforループの外側には表示されません。

+0

はい、私はletとvarの違いを知っています。これがvarを使う代わりにletを選ぶ理由です。要点は、外部ブロックに「let answer」定義がある場合、内部ブロックに「let answer」を再度定義しようとすると構文エラーであり、そのように報告されるべきであるということです。これはC#コンパイラの機能です。 Typescriptは、内部ブロックに異なる名前の変数を作成するだけで、問題を "解決"しようとするべきではありません。これは何かを解決するのではなく、逆に本当のバグを隠すだけです。 – user1941679

+0

技術を比較することは、そのうちの1つで何かが起こると想定する正当な理由ではありません。 Let 'sはそれが想定していたことを正確に行い、typescriptコンパイラはecmascript言語が指定していることをやっています。 –

0

tslint no-shadowed-variableルールは、私が探していたことを行います。

関連する問題