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。两者都是真实运行时检查,可以组合使用。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏