Почему машинописный текст не жалуется на определенные неопределенные переменные

У меня есть следующий пример:

class Uncle {
  constructor(public name : string) { }

  talk() {
    return "Hello my name is " + name;
  }
}

let p : Uncle = new Uncle("Jo");
console.log(p.talk());

Для некоторых имен переменных машинописный текст (сейчас Версия 2.1.4) не будет жаловаться, что они не определены в вашей программе (в разговоре о методе имя используется без это.). name является одним из них.

Если я переименую переменную, скажем, в firstName, компилятор справедливо жалуется...

ошибка TS2663: не удается найти имя "firstName". Вы имели в виду член экземпляра this.firstName?

То же самое касается, например. окно, которое, по-видимому, предполагается существующим.

Мой вопрос (ы):

  • Какие имена переменных предполагаются существующими и почему?
  • Можно ли изменить это поведение (например, в некоторых линтерах вы можете указать, какие переменные должны быть глобально доступны)?

person flq    schedule 19.12.2016    source источник


Ответы (1)


Причина, по которой он не будет жаловаться на name, заключается в том, что в глобальном пространстве имен есть переменная с именем name.
Откройте консоль в инструментах разработчика, напишите name и нажмите Enter, и вы получите: "".

Дополнительные ресурсы:

Все глобальные переменные можно использовать без их определения.

Чтобы удалить все глобальные определения, вы можете, например. в вашем tsconfig.json установите для параметра "libs" пустой массив. Это удалит все глобальные переменные.

person Nitzan Tomer    schedule 19.12.2016
comment
Вы не знаете, есть ли способ отключить это? - person flq; 19.12.2016
comment
Что отключить? Переменная name существует, что вы хотите, чтобы компилятор сделал? - person Nitzan Tomer; 19.12.2016
comment
не обязательно напр. когда вы пишете код для приложения node.js, окно и друзья не будут существовать. В таком случае было бы неплохо, если бы компилятор не предполагал существование этих глобальных переменных. - person flq; 19.12.2016
comment
Ну, я думаю, вы можете поиграть с опцией компилятора --lib и получить конфигурацию, которая не включает name (или другие объявления), вот список библиотек, я не пробовал и не искал, в какую библиотеку она включена, но теоретически это можно сделать. Но мне это кажется перебором. - person Nitzan Tomer; 19.12.2016