Где TypeScript находит свои объявления переменных?

Компилятор tsc всегда успешно компилирует console.log("foo"). Где объявлена ​​переменная console? Компилятор принимает эту программу даже при выключенных всех lib в моем tsconfig.json. Итак, считается ли console универсальным? Какие другие переменные всегда объявляются? В более общем смысле, как я могу узнать, какие другие объявления существуют и откуда они берутся? (Единственный флаг отладки, который я могу найти, это --extendedDiagnostics, но он кажется почти бесполезным.)


person jameshfisher    schedule 03.10.2020    source источник
comment
Когда вы делаете Command + Click или Ctrl + Click на console.log в вашей среде IDE, вы должны перейти к файлу, в котором они объявлены :)   -  person Orkhan Alikhanov    schedule 03.10.2020


Ответы (1)


TypeScript распространяется с набором файлов объявлений lib.*.d.ts, которые описывают стандартные API-интерфейсы библиотек, предоставляемые различными средами выполнения JavaScript.

console описан там.

Язык определяет, какие из этих файлов применимы, на основе параметра --target, автоматически включая их в контекст компиляции.

Например, "target": "es5" заставит компилятор включить lib.es5.d.ts в контекст компиляции.

Вы можете явно настроить, на какой из этих встроенных файлов объявлений следует ссылаться, используя параметр --lib.

Например "lib": ["es2015", "dom", "dom.iterable"].

Если вы используете функции навигации вашей IDE, такие как переход к определению в Visual Studio Code, вы перейдете к украшению для консоли, что позволит вам увидеть, где оно находится.

Дополнительные файлы объявлений, такие как те, которые предоставляются различными пакетами @types, также могут содержать потенциально перекрывающиеся объявления, описывающие API среды выполнения JavaScript. На самом деле это хорошее поведение, потому что оно позволяет пакетам описывать дополнительные возможности, которые они предоставляют.

Например @types/node содержит такие украшения.

При объявлении сторонними пакетами включение этих дополнительных файлов глобального объявления контролируется параметром --types, а не параметром --lib.

Например "types": ["node"].

На включение этих типов не влияет опция --target.

person Community    schedule 03.10.2020
comment
Спасибо, хотя меня смущает то, что даже когда я устанавливаю "lib": [], компилятор, кажется, все еще знает о console, что заставляет меня предположить, что console также объявлено где-то еще. Я ожидаю, что при установке "lib": [] вообще не должно быть предварительно объявленных переменных, но существование console нарушает это. - person jameshfisher; 03.10.2020
comment
Да. Нет никаких ограничений, что другие файлы объявлений не будут определять некоторые подмножества стандартных типов библиотек. На самом деле это хорошее поведение, потому что оно позволяет пакетам описывать дополнительные возможности их среды выполнения. Например @types/node содержит такие украшения. Глобальные типы, добавленные к объявлению сторонними пакетами, управляются параметром "types" вместо "lib" . - person Aluan Haddad; 03.10.2020
comment
Вы правы - в моем случае console было объявлено в @types/node в C:\Users\james\AppData\Local\Microsoft\TypeScript\4.0. Я не понимаю, каков путь поиска компилятора для типизации, но это вопрос будущего. Спасибо! - person jameshfisher; 05.10.2020
comment
На самом деле это функция под названием «Автоматическое получение типа», которую можно отключить. - person Aluan Haddad; 06.10.2020