为何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
相关产品推荐
相关产品推荐

