TypeScript:为什么让print = console.log.bind(console)只在前面有导入的情况下才有效?

Ale*_*tto 0 typescript

我有点困惑:

let print = console.log.bind(console)
Run Code Online (Sandbox Code Playgroud)

不起作用(给出"不能重新声明块范围变量'print'"),但这完美地起作用:

import { readFileSync } from 'fs' //or even import { } from 'anything'
const print = console.log.bind(console)
Run Code Online (Sandbox Code Playgroud)

更令人费解的是,使用变量的另一个名称(如"printIt")可行.

发生了什么?

art*_*tem 5

根据顶级导入或导出语句的存在,文件中的顶级作用域的处理方式不同.这不是一个错误:

具有一个顶级导入/导出的文件(例如,示例中为test.ts)被视为模块.模块有自己的范围,不与全局范围声明合并.

所以,只要你有顶级进口,print变量现在是在自己的范围内,不与全球冲突print中定义DOM类型声明(在浏览器环境中,有顶级命名全局函数print()是打开打印当前页对话框) .