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",这也是它适合做类型守卫的原因。