typescript类型缩小通过typeof、instanceof和in守卫实现:typeof用于基础类型(如typeof v==="string"),instanceof用于类实例(注意iframe中用array.isarray),in用于对象属性判断,需按先typeof后instanceof/in的顺序组合使用。

用 typeof 守卫识别基础类型
对 string | number | boolean | bigint | symbol | undefined | function 这类原始类型,typeof 是最直接的守卫方式。
- 写法必须严格:
typeof x === "string"(双等号、小写字符串字面量),其他形式如==或typeof x == "string"不会触发缩小 -
typeof x === "object"要小心——null也返回"object",所以对象分支建议加&& x !== null - 示例:
function format(v: string | number) { if (typeof v === "string") return v.trim(); else return v.toFixed(2); },分支内类型分别被收窄为string和number
用 instanceof 守卫确认类实例
当你处理自定义类、内置构造器(如 Date、Error)或继承结构时,instanceof 是关键。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 语法是
value instanceof ClassName,依赖原型链,运行时有效 - 支持继承:若
Dog extends Animal,则dog instanceof Animal为真,且分支中类型收窄为Animal;想保留子类能力,就用instanceof Dog - 跨 iframe 场景下
arr instanceof Array可能失效,优先用Array.isArray(arr)
用 in 操作符检查对象结构
当联合类型由多个形状不同的对象组成(比如 { bark: () => void } | { meow: () => void }),in 是自然的选择。
- 判断某个属性名是否存在:
"bark" in animal成立,则 TypeScript 推断该分支中animal至少具备bark属性 - 适用于接口或类型别名定义的具名对象,不依赖构造函数
- 注意:如果属性是可选的(
name?: string),in判断仍有效,但需结合实际值存在性进一步处理
组合判断与顺序很重要
真实参数常混合原始值、类实例、对象结构,单靠一种守卫不够,需要分层判断。
- 推荐顺序:先
typeof排除所有基础类型,再用instanceof或in处理剩余对象分支 - 守卫顺序影响类型推断结果:TypeScript 按
if-else链逐级排除,确保每个分支类型唯一 - 反例:若把
instanceof Error放在typeof x === "string"前面,而x实际是字符串,该分支不会进入,但编译器无法据此排除string可能性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










