You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何检测unknown类型对象的属性键

核心原因

unknown 是 TypeScript 设计的类型安全顶层类型,和放弃类型检查的any不同,TS 强制要求:对unknown类型的值做任何属性访问、方法调用操作前,必须先通过类型守卫收窄类型,证明值的结构符合操作预期。
你写的可选链input?.things?.[0]只能处理值为null/undefined的场景,没法跳过unknown的类型校验规则——TS不会默认unknown类型的值是对象,直接访问属性自然会抛出Object is of type 'unknown'错误。

正确实现

你需要逐层做运行时类型校验,同步完成TS类型收窄,再访问对应路径的属性:

function isFullOfGreatThings(input: unknown) {
  // 先校验input是非null的对象,排除原始值、null的场景
  if (typeof input !== 'object' || input === null) {
    return false;
  }
  // 校验things属性存在
  if (!('things' in input)) {
    return false;
  }
  const { things } = input as { things: unknown };
  // 校验things是数组,才能安全访问索引0
  if (!Array.isArray(things)) {
    return false;
  }
  // 取值判断真值
  return Boolean(things[0]);
}
注意避坑
  • 不要直接把值强转为any绕开检查:比如写Boolean((input as any)?.things?.[0]),这完全放弃了TS的类型安全保障,违背了你用unknown标记不可信输入的初衷。
  • 不要漏掉input === null的判断:JS里typeof null的返回值也是'object',不排除null的话运行时访问属性会抛错。
  • 优先用in操作符判断属性存在:不要直接调用input.hasOwnProperty('things'),如果输入是无原型对象(比如Object.create(null)创建的对象),本身不存在hasOwnProperty方法,会直接抛运行时错误。

内容的提问来源于stack exchange,提问作者mikemaccana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:24:09