Typescript用yarn构建后setInterval内条件分支代码丢失是什么原因
TypeScript转译代码省略规则及代码被移除问题说明
TypeScript原生转译的代码省略规则
TypeScript仅会在转译过程中移除类型相关代码,不会删除正常业务逻辑,默认只会删除以下内容:
- 类型注解、interface、type别名、enum等纯类型定义
- 仅用作类型导入/导出的语句
- 明确的不可达代码,仅当
tsconfig.json中allowUnreachableCode配置为false时生效,例如if (false) {}的代码块
代码被移除的核心原因
该逻辑块被删除的情况并非TypeScript转译导致,而是构建链路中打包工具(Webpack、Rollup、Vite等)的*死代码消除(Dead Code Elimination,简称DCE)*机制触发的,触发原因通常为以下两种:
- 最高作用域声明的
events数组仅声明未初始化,打包工具静态分析时判定该变量永远为undefined,对应if条件永远不成立,内部逻辑被判定为死代码直接移除
打包工具的静态分析仅能识别当前模块内同步执行的逻辑,若
events的修改逻辑在其他模块、或为运行时异步逻辑,静态分析无法识别,会出现误判
- if块内的逻辑没有产生任何外部副作用(无外部变量修改、无外部函数调用、无DOM/IO操作等),打包工具判定该逻辑执行无全局影响,直接做了裁剪
修复方案
可根据实际场景选择以下任意方案:
- 给
events数组添加初始化赋值,避免打包工具误判变量永远为undefined
let events : any[] = [];
- 若
events确实需要延迟初始化,可添加declare修饰符,告诉打包工具该变量的修改逻辑不在当前模块静态分析范围内,跳过对应优化
declare let events : any[];
- 若打包工具的死代码消除过于激进,可在对应代码块添加副作用标记,或在打包配置中将当前文件标记为有副作用的文件,禁止自动裁剪逻辑
内容的提问来源于stack exchange,提问作者Tom Shir
相关产品推荐
相关产品推荐

