2016-11-19 16 views
0

2つのシンプルなTypeScriptコードがあります。TypeScriptでコンパイルが許可されるのはなぜですか?

a.ts

console.log(a); 

a.tsをコンパイルすることができますが、a.tsすることができますなぜコンパイラがb.ts

$ ./node_modules/.bin/tsc a.ts 
$ ./node_modules/.bin/tsc b.ts 
b.ts(1,13): error TS2304: Cannot find name 'a'. 

のために文句を言い

console.log(name); 

b.ts成功する? 私は本当に混乱しています。

私が使用していますv2.0.10

$ ./node_modules/.bin/tsc --version 
Version 2.0.10 

ベスト、

+1

「名前」はグローバルスコープ内に存在する変数ですか? – eddiewould

+1

'window.name'は、ウィンドウの名前を与えるあらかじめ定義されたプロパティです。 –

+0

あなたのIDEがどんなにスマートなのかによって、 'name'がどこから来ているのかを伝えることができます。例えばvscodeでは、 'lib.d.ts'に' declare var name:string; 'という宣言が表示されます。 –

答えて

1

あなたがプロパティ "名前" を参照してくださいよ

for(var b in window) { 
    if(window.hasOwnProperty(b)) console.log(b); 
} 

Chromeデベロッパーツールで、次のコードを実行した場合(Webブラウザの場合、グローバルスコープはウィンドウです)。

したがって、TypeScriptコンパイラは、 'name'(それ以外の場合は宣言されていない変数)をウィンドウ(グローバルスコープ)に存在することを知っているため参照できます。グローバルスコープには 'a'というプロパティはありませんが、コンパイラはその仕事をして、それについてあなたに伝えています。

+2

しかし正確に言えば、TSコンパイラはコンパイル時に 'window'オブジェクトの内容を調べません。したがって、より良い答えは、どのような型指定ファイルで 'window.name'プロパティが宣言され、TSがそれを知っているのか、' window.name'グローバルプロパティのドキュメントを指しているのかを示すでしょう。 –

+0

@eddiewouldとtorazaburoありがとう!私は窓の中の名前に注意します。私はノード上でtypescriptを使い始めたので、私はブラウザのウィンドウのプロパティについて考えなかった:) – tmtk75

関連する問題