typescript - 检查对象是否具有带有类型谓词的键
问题描述
我有一种情况,我认为需要一个类型谓词或“缩小”?
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]
}
解决方案
当然,您可以像这样编写用户定义的类型保护:
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)
因为如果您不知道一个对象具有哪些属性,那么您就不能确定它是否hasOwnProperty
从Object.prototype
. 如果您编写obj.hasOwnProperty(key)
,那么编译器实际上会抱怨T
没有hasOwnProperty
方法,因此这是准确的。
推荐阅读
- r - 确定一天中的最后一次和第一次测量
- python - 在 python 上绘制 PSD(功率谱密度)时需要帮助
- c# - 具有组织/Office 365/Microsoft 帐户身份验证的 Blazor(服务器端);如何做本地多个角色?
- django - 我在 Django 的 Gunicorn 的 Procfile 中放了什么?
- nexus - Flutter pub_hosted_url 镜像 sonatype nexus
- javascript - Javascript querySelectorAll 具有特定类的父元素的元素
- html - 从子导航菜单中删除边距
- python - 有没有办法用多个字符替换空格?
- swift - 如何在 pi 图中从中心到自定义角度画一条线?我正在使用 danielgindi/图表
- pandas - 执行 groupby.median() 时如何保存分类列?