2016-11-19 2 views
0

Существует два простых кода TypeScript.Почему TypeScript позволяет скомпилировать?

a.ts

console.log(name); 

b.ts

console.log(a); 

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'. 

Почему a.ts преуспели? Я действительно смущен.

Я использую v2.0.10

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

Бест,

+1

Возможно, «имя» - это переменная, которая существует в глобальном масштабе? – eddiewould

+1

'window.name' - это предопределенное свойство, указывающее имя окна. –

+0

В зависимости от того, насколько умна ваша среда IDE, она, скорее всего, сможет сказать вам, откуда происходит «имя». Например, в vscode он показывает мне объявление 'declare var name: string;' в 'lib.d.ts'. –

ответ

1

Если выполнить следующий код инструментов разработчика Chrome

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

Вы увидите "имя" свойство (в случае веб-браузера глобальная область видимости - это окно).

Таким образом, компилятор TypeScript позволяет ссылаться на «имя» (что в противном случае было бы необъявленной переменной), поскольку оно знает, что оно существует в окне (глобальная область). В то время как в глобальном масштабе нет свойства «a», поэтому компилятор выполняет свою работу и расскажет вам об этом.

+2

Но, если быть точным, компилятор TS не анализирует содержимое объекта 'window' во время компиляции. Таким образом, лучший ответ показал бы, где в каком типизированном файле объявляется свойство 'window.name', чтобы TS знал об этом, и также указывал бы на документацию для глобального свойства' window.name'. –

+0

@eddiewould и torazaburo Спасибо! Я буду осторожен с именами в окне. Я начал использовать машинопись на узле, поэтому я не думал о свойствах окна браузера :) – tmtk75

Смежные вопросы