问题描述
tsc
编译器始终愉快地编译console.log("foo")
。变量console
在哪里声明?即使我的lib
中的所有tsconfig.json
已关闭,编译器也接受该程序。那么console
被假定为通用的吗?总是声明其他哪些变量?更笼统地说,我如何找出存在的其他声明以及它们来自何处? (我可以找到的唯一调试标志是--extendedDiagnostics
,但似乎几乎没有用。)
解决方法
TypeScript随一组lib.*.d.ts
声明文件一起分发,这些声明文件描述了各种JavaScript运行时提供的标准库API。
console
在其中进行了描述。
该语言根据--target
选项确定哪些文件适用,并自动将它们包括在编译上下文中。
例如"target": "es5"
将使编译器在编译上下文中包含lib.es5.d.ts
。
您可以使用--lib
选项显式配置应引用哪些内置声明文件。
例如"lib": ["es2015","dom","dom.iterable"]
。
如果您使用IDE的导航功能(例如Visual Studio Code中的“转到定义”),将导航到控制台装饰,从而可以看到装饰的位置。
其他各种声明文件,例如各种@types
软件包提供的文件,也可能贡献了可能重叠的描述JavaScript运行时API的声明。这实际上是一个好习惯,因为它允许程序包描述它们提供的其他功能。
例如@types/node
包含这样的修饰。
由第三方包装声明时,这些附加的全局声明文件的包含由--types
选项控制,而不是--lib
选项。
例如"types": ["node"]
。
这些类型的包含不受--target
选项的影响。