Компилятор tsc
всегда успешно компилирует console.log("foo")
. Где объявлена переменная console
? Компилятор принимает эту программу даже при выключенных всех lib
в моем tsconfig.json
. Итак, считается ли console
универсальным? Какие другие переменные всегда объявляются? В более общем смысле, как я могу узнать, какие другие объявления существуют и откуда они берутся? (Единственный флаг отладки, который я могу найти, это --extendedDiagnostics
, но он кажется почти бесполезным.)
Где TypeScript находит свои объявления переменных?
Ответы (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
.
"lib": []
, компилятор, кажется, все еще знает о console
, что заставляет меня предположить, что console
также объявлено где-то еще. Я ожидаю, что при установке "lib": []
вообще не должно быть предварительно объявленных переменных, но существование console
нарушает это.
- person jameshfisher; 03.10.2020
@types/node
содержит такие украшения. Глобальные типы, добавленные к объявлению сторонними пакетами, управляются параметром "types"
вместо "lib"
.
- person Aluan Haddad; 03.10.2020
console
было объявлено в @types/node
в C:\Users\james\AppData\Local\Microsoft\TypeScript\4.0
. Я не понимаю, каков путь поиска компилятора для типизации, но это вопрос будущего. Спасибо!
- person jameshfisher; 05.10.2020
console.log
в вашей среде IDE, вы должны перейти к файлу, в котором они объявлены :) - person Orkhan Alikhanov   schedule 03.10.2020