为何TypeScript认为'name'符号始终存在?是否有预定义全局符号?
为什么TypeScript允许未定义的
name变量? 没错,你遇到的情况是因为TypeScript默认包含了浏览器环境下的全局类型定义,name就是其中一个预定义的全局符号。
在浏览器中,window.name是一个内置的全局属性,用来标识当前窗口的名称,TypeScript的默认类型库(lib.d.ts)已经包含了这个属性的类型声明,所以编译器会认为name是一个合法的全局变量(类型为string),自然不会报错。
如果你想避免这种全局变量的干扰,可以通过以下两种方式解决:
- 将文件转为模块:只要在文件中添加任何模块相关的语法(比如
export {}),TypeScript就会把该文件当作模块处理,而非全局脚本。此时全局变量不会自动注入到模块作用域中,再写console.log(name)就会触发"name is not defined"的错误。 - 调整编译的
lib选项:在tsconfig.json里指定只包含你需要的标准库,比如只启用ES语法而不包含DOM相关的全局变量:
这样编译时就不会加载浏览器环境的全局类型,{ "compilerOptions": { "lib": ["ESNext"] } }name也就不会被识别为合法变量了。
内容的提问来源于stack exchange,提问作者James Hopkin
相关产品推荐
相关产品推荐

