You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ts-node会对未定义变量抛出ReferenceError而非输出undefined?

问题解答

核心原因是未声明的变量和已声明但值为undefined的变量是完全不同的两种情况,JavaScript/TypeScript对它们的处理规则存在本质区别:

  • 如果变量已经通过var/let/const声明过,只是未赋值,它的默认值会是undefined,直接访问这个变量不会报错,比如:

    let foo;
    console.log(foo); // 输出 undefined
    

    这种情况下如果调用它的属性(比如foo.substring(1)),才会因为undefined没有对应的方法抛出TypeError。

  • 但如果变量完全没有被声明过(既没有用关键字声明,也不是全局对象的属性),直接访问它就会触发ReferenceError——这是JavaScript的语言规范要求,ts-node只是严格遵循这个规则执行而已。

回到你的问题:__IS_LOCAL_DEVELOPMENT_BUILDING_MODE__属于完全未声明的标识符,所以直接用console.log访问它时,会立刻抛出ReferenceError,根本不会走到输出undefined的步骤。

如果想避免这个错误,通常有两种处理方式:

  • 在构建阶段通过工具(比如Webpack的DefinePlugin)将这个标识符替换为实际值(比如true/false);
  • 在TypeScript代码里提前声明它为全局变量,比如添加:
    declare const __IS_LOCAL_DEVELOPMENT_BUILDING_MODE__: boolean;
    

内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:22:10