typeof typeof 收窄

最后更新:2026-10-22

typeof typeof 收窄

typeof 收窄是最常用的类型守卫:在运行时用 typeof 检查值的类型字符串,TypeScript 会顺着这个判断把联合类型收窄到对应分支。比如 typeof value === "string" 之后,value 就被当作 string,可以放心调用字符串方法。

分组收窄与断言
类型操作符
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

function toNumber(value: string | number): number {
  if (typeof value === "string") {
    return Number(value);   // 这里 value: string
  }
  return value;             // 这里 value: number
}

⚙️ 参数

typeof value运行时求值,返回 "string" / "number" / "boolean" / "object" / "function" / "undefined" / "symbol" / "bigint" 八种字符串之一

返回值:typeof 表达式本身返回类型字符串;收窄效果发生在编译期——分支内变量的类型被替换为对应的具体类型。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

string of length 5
number, doubled = 42
boolean: off

(转译后运行输出;每个 case 里访问 value.length、value * 2 能通过类型检查,是因为 typeof 收窄已生效——收窄由 tsc 静态保证,运行时只看到值)

💡 要点

ℹ️ 说明 typeof null === "object" 是 JS 的历史遗留。TS 已内置处理:typeof 检查后 null 分支会被正确收窄,不会把 null 混进 "object" 分支。
⚠️ 注意 typeof 无法区分数组和普通对象——两者都返回 "object"。需要区分数组时用 Array.isArray(x),需要区分具体对象形状时用 in 或可辨识联合。
💡 提示 typeof 有两个身份:在值位置是运行时运算符,在类型位置是类型运算符(type T = typeof someVar 取变量的类型)。本条讲的是前者的收窄用法。
更多案例即将上线。

📚 相关教程

❓ 常见问题

Q 为什么 typeof 收窄后数组还是 object?
A JS 里数组就是对象,typeof 统一返回 "object"。TS 提供了专门的 Array.isArray() 守卫来收窄数组,它才是处理 string | number[] 这类联合的正确工具。
Q switch (typeof value) 和连续 if 有区别吗?
A 收窄效果完全一样,都是 TS 识别的守卫形式。分支多于三个时 switch 可读性更好,且配合穷尽检查(default 里用 never)能防漏分支。
Q typeof value === "string" 会不会在运行时报错?
A 不会。typeof 是极少见的可以对任意表达式安全求值的运算符,对未声明变量也只是返回 "undefined",这也是它适合做类型守卫的原因。
Web-Tutorial.com

Web-Tutorial 技术团队

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

100%

🙏 帮我们做得更好

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

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