控制流分析为何会在闭包、赋值与异步边界后撤销类型收窄
简答题中等986 次浏览
参考答案与解析
# 核心结论
TypeScript 的类型收窄是编译器在特定控制流位置推导出的临时事实,不是对变量声明类型的永久修改。变量被重新赋值、对象属性可能通过别名被修改、代码进入延迟执行的闭包,或业务状态跨越异步时间边界后,先前事实可能不再可靠,因此收窄会被撤销或需要重新验证。稳妥做法是缩小可变状态的作用域:需要使用验证时快照,就把值复制到不可变局部变量;需要执行时最新状态,就在回调或异步恢复后重新读取并收窄。
# 底层机制
检查器会根据条件判断、提前返回、赋值、循环、异常路径和类型守卫建立控制流关系。对联合类型进行 typeof、instanceof、判别字段比较或自定义类型守卫后,当前可达分支会获得更具体的流类
