dev.to | 📄 原文链接 | 2026-10-01 收录

TypeScript 编译器 API:让可复用的类型守卫同时保留子节点收窄

来源:dev.to — 2026-09-30

📋 概述

作者从一个很具体的问题出发:可复用的类型守卫,能不能在保留 AST 节点类型的同时,也保留被收窄的子属性?把 ts.isCallExpression(node) && ts.isIdentifier(node.expression) 内联写出来时,TypeScript 的控制流分析完全够用;但一旦想给这个形状起个名字以便在 visitor、filter、find 里复用,自 v5.5 起能自动推断简单类型谓词的能力就无能为力了,因为这是「父节点加子属性」的复合判断,必须把收窄后的类型手写出来——尽管那些运行时检查明明已经做过了。他用 is-kit 的 refineKey 解决了这件事:让子属性在运行时被检查一次,再把同一个事实带回父类型;对可选属性则用 refineDefinedKey,先要求它存在再收窄。最有价值的结论是:这根本不是编译器 API 的短板,而是一个通用的属性精炼问题,AST 只是它最好的压力测试。

🔑 核心要点

💡 金句

在运行时检查一次子节点,再把同一个事实带回父类型。
← 返回 dev.to 首页