首页 > 解决方案 > 检查对象是否具有带有类型谓词的键

问题描述

我有一种情况,我认为需要一个类型谓词或“缩小”?

const obj1 = { foo: 123 }
const obj2 = { bar: 456 }

type ObjKey = keyof typeof obj1 | keyof typeof obj2
function getVal(key: ObjKey) {
  return key in obj1 ? obj1[key] : obj2[key]
}

那不起作用,我是否在检查功能上放置了“类型保护”?不知道如何编写该示例:

function objHasKey(obj: object, key: string) {
  return obj.hasOwnProperty(key)
}
function getVal(key: ObjKey) {
  return objHasKey(obj1, key) ? obj1[key] : obj2[key]
}

标签: typescript

解决方案


当然,您可以像这样编写用户定义的类型保护:

function objHasKey<T>(obj: T, key: PropertyKey): key is keyof T {
  return Object.prototype.hasOwnProperty.call(obj, key);
}

请注意,这Object.prototype.hasOwnProperty.call(obj, key)几乎总是比它更可取,obj.hasOwnProperty(key)因为如果您不知道一个对象具有哪些属性,那么您就不能确定它是否hasOwnPropertyObject.prototype. 如果您编写obj.hasOwnProperty(key),那么编译器实际上会抱怨T没有hasOwnProperty方法,因此这是准确的。

游乐场链接


推荐阅读