用途:解决 TypeScript 类型收窄(narrowing)失效的问题,尤其是把对象属性赋给变量后、属性检查与变量使用混用时出现的“possibly undefined”报错。
主要能力与要点:别名与原属性被 TypeScript 分别跟踪,收窄其中一个不会影响另一个;对 polygon.bbox 做 if 检查不会收窄之前创建的 const box。核心规则是一个作用域内只用一个别名或只用原属性,绝不混用;推荐用解构(const { bbox } = polygon)保持一致命名,也可继续解构 x、y。
运行时与函数调用:别名在运行时也会分叉,例如用解构出的 bbox 做判断后调用函数填充 polygon.bbox,别名仍是 undefined。TypeScript 假定函数调用不会使属性的收窄失效,这通常可用但可能出错;更安全的做法是把属性捕获为局部变量,或用 Readonly 参数防止修改。
常见模式:用空值合并运算符替代先建别名再判断;Map 的 has() 与 get() 不联动,建议直接 const value = map.get(key),再判断 value !== undefined。
红旗信号:由属性创建变量后又用属性做条件;if 检查之后仍报 possibly undefined;同一代码块中混用属性访问与变量;函数调用后仍依赖原有收窄。本技能基于《Effective TypeScript》第23条。适用场景为 TypeScript 类型收窄调试与代码审查;限制是仅涉及类型收窄与别名使用约定,其他事实暂未提供。