Object.hasOwn(obj, prop) 是 TypeScript 中检测自有属性最规范的做法,语义明确、类型安全、运行时健壮,自 TS 4.9 起原生支持,配合 ESLint 和类型守卫可全面提升代码质量。

直接用 Object.hasOwn(obj, prop) 替代 obj.hasOwnProperty(prop),是 TypeScript 环境下检测自有属性最规范的做法。它语义明确、类型安全、运行时健壮,且与现代 TypeScript 工程实践高度契合。
类型定义与编译支持
TypeScript 从 4.9 版本起原生支持 Object.hasOwn 的类型签名,无需额外声明。只要你的 tsconfig.json 中 "lib" 包含 "es2022" 或更高版本(如 ["es2022", "dom"]),就能获得完整类型推导和自动补全:
- 参数
obj类型为any或更严格的对象类型(如Record<string, unknown>),TS 会校验是否可为对象 - 参数
prop类型为PropertyKey(即string | number | symbol),天然支持 Symbol 键 - 返回值被精确推断为
boolean,无联合类型或 undefined 风险
配合 ESLint 强化规范落地
启用 @typescript-eslint/no-prototype-builtins 规则(替代已废弃的 no-prototype-builtins),可自动拦截所有 hasOwnProperty 实例调用:
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
- 在
.eslintrc.cjs中配置:"@typescript-eslint/no-prototype-builtins": "error" - 编辑器实时标红
obj.hasOwnProperty('x'),提示改用Object.hasOwn(obj, 'x') - CI 流程中失败构建,杜绝遗漏
处理可能为 null/undefined 的对象
Object.hasOwn 对 null 或 undefined 明确抛出 TypeError,这反而是优势——它让潜在错误暴露得更早。实际编码中应先做有效性判断:
- 推荐写法:
obj != null && Object.hasOwn(obj, 'key') - 避免写法:
Object.hasOwn(obj, 'key')(当obj可能为null时) - 若需默认行为(如
null时返回false),封装工具函数:const hasOwn = (obj: unknown, key: PropertyKey) => obj != null ? Object.hasOwn(obj, key) : false;
泛型与类型守卫增强表达力
在需要类型收缩的场景(如条件分支后推断字段存在),可结合类型守卫使用:
- 定义守卫函数:
function hasProp<T extends object, K extends PropertyKey>(obj: T, key: K): obj is T & Record<K, unknown> { return Object.hasOwn(obj, key); } - 使用后 TS 能识别该字段一定存在:
if (hasProp(user, 'email')) { user.email.toLowerCase(); // ✅ 不报错 } - 比
in操作符更精准,只检查自身属性,不包含原型链上的

















