TypeScript Error when accessing properties on globalThis with the same name of a global variable

kknvjkwl  于 6个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(63)

🔎 搜索词

globalThis重新定义的错误脚本属性不存在

🕗 版本与回归信息

  • 这是我尝试的每个版本中的行为

⏯ Playground链接

https://www.typescriptlang.org/play/?noImplicitAny=false&ts=5.5.0-beta#code/DYUwLgBAlgdgbgQ2FAJgRggXggc2AewCMkAVACygGcA6WRZdAbgChRIBPLXA44cq2vCSo0LNhABeXPEVIUadYSgBMLIA

💻 代码

let invalid1 = globalThis.invalid1;
let y = globalThis.invalid1;
let z = globalThis.invalid2;

🙁 实际行为

Property 'invalid1' does not exist on type 'typeof globalThis'.

🙂 预期行为

它应该要么抱怨 invalid1invalid2,要么两者都不抱怨

关于问题的附加信息

这个问题只发生在脚本中,而不是模块中(如果我添加 export {},没有报告错误)。

roejwanj

roejwanj1#

我认为您实际上应该在这里看到的是一个循环误差。

c7rzv4ha

c7rzv4ha2#

let invalid1 = 1 没有定义 globalThis.invalid1,因此没有发生循环(仅在 var 时才会出现这种情况)。
请注意,上面的代码实际上具有有效的用例。我在执行

let SuppressedError = globalThis.SuppressedError ?? class SuppressedError extends Error {
  // ...
}

时发现了它。

2w3rbyxf

2w3rbyxf3#

你好@nicolo-ribaudo。
在声明变量之前尝试使用变量将导致ReferenceError。这被称为“时间死区”,其中变量存在于作用域中,但无法访问。
然而,当你使用var声明一个变量时,变量声明会被提升(或“提升”)到当前作用域的顶部。这意味着,无论你在代码中在哪里声明该变量,JavaScript都将其视为如果你在作用域的开头声明它一样。然而,只有声明会被提升,而不是初始化。因此,如果你在初始化之前尝试访问该变量,它的值将是undefined,但不会引起错误。
另一方面,当你使用let声明一个变量时,声明也会被提升,但是JavaScript将这些变量放在从块开始到声明处理完毕的“时间死区”中。在这个“死区”期间,如果你尝试访问该变量,你将收到一个ReferenceError。
所以,在你的情况下,当你尝试执行let invalid1 = globalThis.invalid1;而不定义globalThis.invalid1时,invalid1等于undefined。这本身并不是问题,但是如果你在这一点之前的代码中尝试访问invalid1,你将因为let的“时间死区”而收到一个ReferenceError。
然而,如果你使用var代替let,就像在var invalid1 = globalThis.invalid1;中那样,即使globalThis.invalid1没有定义,invalid1也只会是undefined,不会引起错误,即使你在这一点之前访问了invalid1,多亏了var的提升。

epggiuax

epggiuax4#

在上面的示例中,没有变量处于时间死区--您可以尝试运行该代码,它不会出错。

csga3l58

csga3l585#

FWIW,这个错误在这里报告,这是负责将invalid1成员放入符号表的mergeSymbols调用。从某种意义上说,这是设计的一部分,因为代码在某种程度上对此是明确的。但也许这应该重新审视一下。

相关问题