typescript - 访问 Typescript 对象中的动态二级属性
问题描述
我需要访问 Typescript 中的一个对象属性,其中两个级别是动态的,例如 object[key1][key2]。
即使我相信我做了适当的检查,我仍然会收到类型错误。
(object[key1] as any)[key2] 有效,但看起来不是很优雅。
有没有更好的办法?真的很感激一个想法。
在代码+操场下方。
const POIs = {
amenity: {
bar: {
activity: "night",
icon: "glass"
}
},
building: {
supermarket: {
activiy: "day",
icon: "warehouse"
}
}
}
interface noiseData {
tags: {
[T in keyof typeof POIs]: keyof typeof POIs[T]
}
}
function parseNoiseSources(nss: noiseData[]): void {
for (const ns of nss) {
for (const category in POIs) {
const cat = category as keyof typeof POIs
const key = ns.tags[cat]
if (cat in ns) {
const obj = POIs[cat]
if (key in obj) {
const act = POIs[cat][key].activity
// Below satisfies the compiler but seems redundant
// const bct = (POIs[cat] as any)[key].activity
}
}
}
}
}
确切的错误消息是这样的: 元素隐式具有“任何”类型,因为表达式类型为“酒吧”| "supermarket"' 不能用于索引类型 '{ bar: { activity: string; 图标:字符串;}; } | {超市:{活动:字符串;图标:字符串;}; }'。类型 '{ bar: { activity: string; 上不存在属性 'bar' 图标:字符串;}; } | {超市:{活动:字符串;图标:字符串;}; }'。
非常感谢您的帮助!
解决方案
您应该为您的 POI 对象添加类型:
interface DataFrame {
activity: string;
icon: string;
}
type Keys = 'amenity' | 'building'
type Data = Record<Keys, Record<string, DataFrame>>
const POIs: Data = {
amenity: {
bar: {
activity: "night",
icon: "glass"
}
},
building: {
supermarket: {
activity: "day",
icon: "warehouse"
}
}
}
interface noiseData {
tags: {
[T in keyof typeof POIs]: keyof typeof POIs[T]
}
}
function parseNoiseSources(nss: noiseData[]): void {
for (const ns of nss) {
for (const category in POIs) {
const cat = category as keyof typeof POIs
const key = ns.tags[cat]
if (cat in ns) {
const obj = POIs[cat]
if (key in obj) {
const act = POIs[cat][key].activity // no error
// Below satisfies the compiler but seems redundant
// const bct = (POIs[cat] as any)[key].activity
}
}
}
}
}
bar
和supermarket
对象应该有相同的类型
推荐阅读
- python - 如何将来自我的机器人的消息放入 Discord 的黑匣子中?
- pandas - 从数据框列的字符串中提取数值并用该数值替换字符串
- php - 如何在 codeigniter PHP 7.3 中按 Mongodb 中的总字数对数据 ASC 进行排序
- javascript - Javascript计算器不显示值?
- rest - 如何使用是/否字段过滤 REST API URL 中的列表
- angular - Angular Flex 布局 - fxLayoutGap.lt-lg="0px grid" - 在 Safari 中不起作用
- sql - 从一行中具有相同 id 的表中选择 Min 和 Max Value
- authentication - 使用客户端 ID 和客户端密码调用由 AAD 保护的 azure 函数
- php - 考虑营业时间,检索两个日期之间的剩余时间
- security - 如何防止“所有者”更改 GCP 控制台/云 shell 与 terraform 代码冲突?