instanceof instanceof 收窄
最后更新:2026-10-22
instanceof instanceof 收窄
instanceof 收窄用于"类"的联合:检查某个值是不是某个类的实例,是的话 TS 就把它的类型收窄成这个类。它靠 JS 的原型链在运行时真实判断,是处理 Date、Map、Error 以及自定义类联合的标配工具。
| 分组 | 收窄与断言 |
|---|---|
| 类型 | 操作符 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
function logValue(x: Date | string) {
if (x instanceof Date) {
console.log(x.toISOString()); // x: Date
} else {
console.log(x.toUpperCase()); // x: string
}
}
⚙️ 参数
| instanceof Klass | 运行时沿原型链检查 Klass.prototype 是否出现在对象的原型上;TS 同时把类型收窄为 Klass(或其子类) |
|---|
返回值:instanceof 表达式返回 boolean;收窄效果发生在编译期,且要求 instanceof 的右侧是带 prototype 的构造函数。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
Article: TS Basics
Video: 95s
(转译后运行输出;item.title、item.duration 能通过类型检查,是因为 instanceof 收窄已生效——收窄由 tsc 静态保证,运行时只看到值)
💡 要点
ℹ️ 说明 instanceof 是真实的运行时检查(查原型链),所以它对经过 JSON.parse 还原的"长得像"对象不起作用——那些对象的原型是 Object.prototype,不是你的类。
⚠️ 注意 instanceof 不能用于 interface——接口转译后不存在,没有可检测的构造函数。接口形状请用 in、自定义类型守卫或可辨识联合来区分。
💡 提示 跨 iframe 或跨 vm 传来的对象,原型与当前全局的类不同,instanceof 可能误判 false。这类边界数据建议用自定义类型守卫按结构校验。
🏷️ 相关收窄与断言
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q instanceof 能收窄子类吗?
A 能。instanceof 沿原型链检查,子类实例 instanceof 父类 也为 true;反之 父类实例 instanceof 子类 为 false。TS 收窄时也会考虑继承关系。
Q 为什么用 instanceof 检查 JSON.parse 的结果总是 false?
A JSON.parse 生成的是普通对象,原型是 Object.prototype,不会带上你定义的类的原型。要判断结构请用自定义类型守卫(x is T)逐字段校验。
Q instanceof 和 typeof 该选哪个?
A 原始类型(string/number/boolean 等)用 typeof;类实例(Date、Map、自定义类)用 instanceof。两者都是真实运行时检查,可以组合使用。