2016-11-19 2 views
0

Es gibt zwei einfache TypeScript-Codes.Warum erlaubt TypeScript das Übersetzen?

a.ts

console.log(name); 

b.ts

console.log(a); 

a.ts kompiliert werden kann, aber Compiler beschwert für b.ts

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

Warum a.ts kann erfolgreich sein? Ich bin wirklich verwirrt.

Ich bin mit v2.0.10

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

Best,

+1

Vielleicht ist "Name" eine Variable, die im globalen Geltungsbereich existiert? – eddiewould

+1

'window.name' ist eine vordefinierte Eigenschaft, die den Namen des Fensters angibt. –

+0

Abhängig davon, wie intelligent Ihre IDE ist, ist es wahrscheinlich in der Lage, Ihnen zu sagen, woher 'name' kommt. In vscode zum Beispiel zeigt es mir die Deklaration 'declare var name: string;' in 'lib.d.ts'. –

Antwort

1

Wenn Sie den folgenden Code in Chrome-Entwickler-Tools

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

ausführen Sie erhalten eine Eigenschaft "name" sehen (Im Fall eines Webbrowsers ist der globale Bereich das Fenster).

Mit dem TypeScript-Compiler können Sie also auf 'name' verweisen (was sonst eine nicht deklarierte Variable wäre), da er weiß, dass er im Fenster existiert (der globale Gültigkeitsbereich). Während es im globalen Geltungsbereich keine Eigenschaft "a" gibt, erledigt der Compiler seine Aufgabe und sagt Ihnen etwas darüber.

+2

Genauer gesagt, der TS-Compiler untersucht den Inhalt des 'window' -Objekts zur Kompilierzeit nicht. Daher würde eine bessere Antwort zeigen, wo in der Typisierungsdatei die 'window.name' -Eigenschaft deklariert ist, so dass TS davon weiß, und würde auch auf die Dokumentation für die globale Eigenschaft' window.name' verweisen. –

+0

@eddiewould und torazaburo Danke! Ich werde vorsichtig mit Namen im Fenster sein. Ich fing an, Typoskript auf Knoten zu verwenden, also dachte ich nicht über Fenstereigenschaften des Browsers nach :) – tmtk75

Verwandte Themen