先记住这个答案
TypeScript 能识别 typeof 检查,并在相应分支把候选收窄到字符串、数字、布尔值等运行时类别。typeof 的结果包括 string、number、bigint、boolean、symbol、undefined、object 和 function;其中 null 的结果仍是 object,数组也属于 object。要读取业务对象字段,必须继续排除 null,并检查需要的属性和值类型。类型位置上的 typeof 则是在类型系统中查询变量的静态类型,与运行时分支检查用途不同。
- typeof 识别基础类别,不能验证完整对象协议
- object 分支要考虑 null、数组和具体字段
- 类型位置 typeof 查询不会执行运行时判断
为什么 object 分支不能直接读字段
历史上 typeof null 就返回 object,TypeScript 不会为了更好看而改变 JavaScript 语义。输入若可能为空,仅检查 object 后直接访问属性仍然不安全。对象分类还包含数组、日期和各种实例,不能因此认定它拥有某个业务字段。
示例接受字符串或带字符串 label 的对象,先处理字符串,再逐步建立对象和字段证据。空值会被排除,属性存在后仍需检查字段类型。无法满足这份小契约时返回明确兜底,避免从一个宽泛对象判断跳到完整接口断言。
function labelOf(value: unknown): string {
if (typeof value === 'string') return value.trim();
if (typeof value === 'object' && value !== null &&
'label' in value && typeof value.label === 'string') {
return value.label.trim();
}
return 'unknown';
}
function incomplete(value: object | null) {
if (typeof value === 'object') {
// @ts-expect-error typeof object 尚未排除 null
return value.toString();
}
}第一个函数只使用被证明是字符串的值,第二个函数保留反例,验证 object 判断之后空值仍是候选。若协议禁止数组,应在对象分支继续加入 Array.isArray 排除。
基础类型通过不等于业务值有效
typeof value 为 number 时,可以使用数字方法,但这个集合还包含 NaN 和正负无穷。金额、页码、时间戳等业务常常要求有限值、整数或范围限制,应继续使用对应检查。类似地,字符串类型并不能证明它是合法网址或有效日期。
typeof 为 function 可以证明可调用的基础形态,却不能自动证明函数接受某套参数并返回某种结果。动态插件接口需要明确适配协议或其他外部保证。把基础类别判断包装成过强类型谓词,会让后续调用得到不应有的安全感。
两种 typeof 写法不要混淆
表达式中的 typeof config 会在运行时返回分类字符串;类型位置中的 type Config = typeof config 则提取这个变量已有的静态类型,用于避免重复声明。后者在编译后被擦除,也不能检查从网络拿到的新对象是否与 config 一致。
调试时可以先确认当前报错来自哪一层。想辨别数组应考虑 Array.isArray,想区分受控类实例可以考虑 instanceof,想验证业务字段则继续做属性检查。每个检查只承担它能证明的范围,把它们组合成清楚的解析路径。
容易答错的地方
- typeof 返回 object 就说明是普通非空对象
- 该分类包含 null、数组及多个实例类型,不能直接推导业务结构;必须根据后续操作继续排除不适用的候选。
- typeof 数字检查可以拒绝 NaN
- NaN 的基础类型仍然是 number,有限性和取值范围需要额外判断;否则计算结果可能在类型通过的情况下继续传播无效数字。
面试官还会怎么问?
为什么数组不能通过 typeof 单独识别?
JavaScript 将数组归入 object 类别,专门识别数组应使用 Array.isArray;随后仍要验证每个元素是否满足需要的类型契约。
typeof 能检测某个 TypeScript 接口吗?
不能,接口在运行时不存在;应检查真实字段或使用解析器,不能把接口名字当成运行时构造函数或类型标签。
判断 function 后是否可以信任返回值?
只能建立基础可调用信息,具体参数和返回契约仍需受控来源、适配层或执行结果校验,不能凭分类字符串推导完整函数签名。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。